Подтвердить что ты не робот

Как протестировать контроллер Jasmine AngularJS, который вызывает метод обслуживания, который возвращает обещание

Я использую v1.2.0-rc.3 AngularJS с тестовой средой Жасмина.

Я пытаюсь утверждать, что контроллер вызывает метод службы. Метод сервиса возвращает обещание. Контроллер выглядит так:

angular.module('test', [])
.controller('ctrl', ['$scope', 'svc', function ($scope, svc) {
  $scope.data = [];
  svc.query()
  .then(function (data) {
    $scope.data = data;
  });
}]);

Я хочу проверить, что данные присваиваются области, когда отложен метод службы. Я создал макет для службы, а unit test выглядит так:

describe('ctrl', function () {
  var ctrl, scope, svc, def, data = [{name: 'test'}];
  beforeEach(module('test'));
  beforeEach(inject(function($controller, $rootScope, $q) {
    svc = {
      query: function () {
        def = $q.defer();
        return def.promise;
      }
    };
    scope = $rootScope.$new();
    controller = $controller('ctrl', {
      $scope: scope,
      svc: svc
    });
  }));
  it('should assign data to scope', function () {
    spyOn(svc, 'query').andCallThrough();
    deferred.resolve(data);
    scope.$digest();
    expect(svc.query).toHaveBeenCalled();
    expect(scope.data).toBe(data);
  });
});

Я ожидаю, что будет вызван метод запроса svc, но, видимо, этого не произошло.

Я последовал за этим руководством насчет насмешек promises в модульных тестах.

Что я делаю неправильно?

4b9b3361

Ответ 1

Кажется, я помещал своего шпиона в неправильное место. Когда я помещаю его в beforeEach, тест проходит.

  beforeEach(inject(function($controller, $rootScope, $q) {
    svc = {
      query: function () {
        def = $q.defer();
        return def.promise;
      }
    };
    spyOn(svc, 'query').andCallThrough();
    scope = $rootScope.$new();
    controller = $controller('ctrl', {
      $scope: scope,
      svc: svc
    });
  }));