Модульный тест в угловом контроллере js, который вызывает сервис с http запросом - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь выполнить модульный тест для контроллера angularjs. Контроллер выполняет вызов службы, которая реализует http get. После выполнения этого вызова в случае успеха значение присваивается переменной области. Но дело в том, что я не нахожу, как имитировать это действие. Здесь я оставляю свой код.

Сервис:

export class AnalysisService extends Observable {

constructor($log, $http, tenant, trainer){
    "ngInject";

    // call super constructor
    super();

    this.$http = $http;
    this.tenant = tenant;
    this.trainer = trainer;
}

getDeploys(project, analysis)
{
    return this.$http.get(`${this.trainer}/${this.tenant.id}/projects/${project}/analyses/${analysis}/deploys`);
}
}

Контроллер:

export class ModelsController {

constructor($scope, $routeParams, analysis){
  $scope.opt = false;
  $scope.data = {};

  analysis.getDeploys($scope.project, $scope.analysisId)
        .then(
            function(analDep)
            {
                $scope.opt = true;
                $scope.data = analDep.data; 
            }, 
            function(analDepErr)
            {
                console.log(analDepErr);
            },
        );

}

Модульный тест:

import 'angular-mocks';

describe('ModelsController', function() {
    beforeEach(angular.mock.module("my-trainer"))
    var $controller, mockAnalysis;

    beforeEach(inject(function(_$controller_, analysis){
      $controller = _$controller_;
      mockAnalysis = analysis;
    }));

    describe('Unit test Controller ModelsController', function() {
      var $scope, controller;

      beforeEach(function() {
       var fakeHttpPromise = {
       then: () => {
         return {
           data: {
             _embedded: {
                collectors: [
                 {id:1, name:'demo1'},
                 {id:2, name:'demo2'},
                 {id:3, name:'demo2'}
             ]}
           }};
        }};
      });

     spyOn(mockAnalysis, 'getDeploys').and.returnValue(fakeHttpPromise);

    controller = $controller('ModelsController', { $scope: $scope, analysis: mockAnalysis });

    it('checking $scope.opt and $scope.data after call analysis', function() {
        //..........................

        // here my problem. I have done many things but none works for me
        //.........................  
    });
})

1 Ответ

0 голосов
/ 15 октября 2019

Способ реализации fakeHttpPromise , работать не будет. Поскольку ваш метод then не будет вызываться автоматически. Используйте сервис $ q и верните обещание и разрешение с вашими данными, которые в конечном итоге вызовут ваш метод затем.

Внедрите сервис $ q, вы также не ввели $ scope. укажите введенный объем в вашем контроллере

beforeEach(inject(function(_$controller_, analysis, $q, $scope){
      $controller = _$controller_;
      mockAnalysis = analysis;
      $q = $q;
      $scope = $scope;
    }));

Теперь верните обещание:

describe('Unit test Controller ModelsController', function() {
      var $scope, controller;
      var data = { // data to be returned
             _embedded: {
                collectors: [
                 {id:1, name:'demo1'},
                 {id:2, name:'demo2'},
                 {id:3, name:'demo2'}
             ]}
           };

      beforeEach(function() {
         var deferred = $q.defer();
         var promise = deferred.promise; // return promise
         deferred.resolve(data) // above defined data

      });

     spyOn(mockAnalysis, 'getDeploys').and.returnValue(promise ); // return promise
     controller = $controller('ModelsController', { $scope: $scope, analysis: mockAnalysis });
     $scope.apply() // this will make your .then() method called.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...