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

Как проверить $scope. $On в AngularJS

Как проверить, заполняется ли область после трансляции? Я искал и нашел несколько QA здесь, в stackexchange, но никто не ответил на мою проблему. Код работает нормально, просто не знаю, как его проверить. Могу ли я добавить, что я новичок в тестировании, и особенно с Jasmine.

Итак, вот код:

Сервис CrappySvc:

update: function() {
    $rootScope.$broadcast('updatecrappy', Crappy.query());
}   

Контроллер GetCrappyCtrl:

  $scope.$on('updatecrappy', function(event, crap) {
    $scope.crap = crap;
  });

Жасмин:

beforeEach(inject(function($rootScope, $httpBackend, $controller, Crappy) {
  rootScope = $rootScope;
  scope = $rootScope.$new();
  Crappy = mockCrappy;

      ...
  spyOn(rootScope, '$broadcast');
      ...

  ctrl = $controller('GetCrappyCtrl', {
  $scope : scope,
  Crappy : mockCrappy
});               

}));

it('$scope.$on should have been triggered', function() {          
  rootScope.$broadcast('updatecrappy', [{id : 2, name : 'crappy'}]);
  expect(rootScope.$broadcast).toHaveBeenCalledWith('updscenes', [{id : 2, name : 'crappy'}]);

});

Камень

4b9b3361

Ответ 1

Вам нужно сообщить Жасмину, чтобы шпион мог вызвать действительную функцию широковещания $

spyOn($rootScope, '$broadcast').andCallThrough();

Если вы не используете andCallThrough(), шпион ничего не делает.

Жасмин Docs

ИЗМЕНИТЬ

С Жасмином 2 синтаксис будет

spyOn($rootScope, '$broadcast').and.callThrough();

Ответ 2

Если вы хотите подделать returnValue из $scope.$broadcast(), вы можете сделать что-то вроде этих двух случаев:

Случай 1:

scope.$broadcast('TEST_CHANGED', {test: 'test1'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something).toEqual('something');

Случай 2:

scope.$broadcast('TEST_CHANGED', {test: 'test2'});
spyOn(scope, '$broadcast').and.callThrough();
expect(something2).toEqual('something2');

Ответ 3

Что касается " toHavebeenCalled", нет необходимости " иCallThrough()". Простой шпион будет работать. В вашем случае ваши аргументы разные.

Вы вещаете, как, rootScope. $broadcast ('updatecrappy', [{id: 2, name: 'crappy}});

Но вы ожидаете:

ожидать (rootScope. $broadcast).toHaveBeenCalledWith( 'updscenes', [{id: 2, name: 'crappy}});

Посмотрите на аргумент updarecrappy ", но в этом случае он будет updscenes.

Ответ 4

Посмотрите на пример кода ниже, он работает хорошо для меня.

Извлечение примера события 'onTimeChanged' из $rootScope. Мой контроллер имеет прослушиватель 'onTimeChanged', и я вызываю метод timeChanged() внутри него.

describe('onTimeChanged()', function() {
    it('should call another method or controller', function() {
        spyOn(searchCtrl, 'timeChanged');
        $rootScope.$emit('onTimeChanged');
        expect(searchCtrl.timeChanged).toHaveBeenCalled();
    });
});

Обратите внимание, что я не шпионил за методом '$ emit' от rootScope.