Как проверить $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'}]);
});
Камень
Ответы
Ответ 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.