karma/jasmine/angular toHaveBeenCalledWith действительно называется

в моем приложении, например, у меня есть

$rootScope.$emit('loggedin',data.user);
$rootScope.$on('loggedin', function(event,user) {
    console.log('called');           
});

в моем тесте

spyOn($rootScope, '$emit');

var response = {
    "success":1,
    "user":{
        "id":1,
        "email":"[email protected]",
        "fullname":"Lama user",
        "username":"lamauser",
        "groups":["Users"]
    },
    "logged":1
};
$httpBackend.when('POST', '/api/v1/user').respond(200,response);
$scope.save();
$httpBackend.flush();
expect($scope.errors.length).toEqual(0);
expect($rootScope.$emit).toHaveBeenCalledWith('loggedin',response.user);

и приложение, и тест работают хорошо, но в тесте я никогда не вижу сообщение консоли вызвано

поэтому мне интересно, если во время теста $on никогда не срабатывает или я что-то пропустил.


person Whisher    schedule 17.08.2014    source источник


Ответы (1)


Если вы хотите, чтобы вызывался реальный $emit(), вы должны установить его явно после spyOn следующим образом:

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

Или в Жасмин 1.3:

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

Надеюсь это поможет.

person runTarm    schedule 17.08.2014
comment
Я только что попробовал с .andCallThrough(); но я продолжаю не видеть "позвонил" - person Whisher; 17.08.2014
comment
ммм, кажется, есть проблема с $ rootScope, потому что, если я помещу прослушиватель $ on в блок запуска, он сработает. - person Whisher; 17.08.2014
comment
Ваши $emit и $on действительно в таком порядке? Если да, то причина в том, что вы пытаетесь создать событие, прежде чем подписаться на него. Попробуйте переместить $on вверх до $emit. - person runTarm; 17.08.2014
comment
У меня есть $on в отдельном контроллере, который $emit в контроллере прикрепляется к маршруту. Я не понимаю, почему это работает в приложении, а не в тесте - person Whisher; 17.08.2014
comment
Кажется, ваш separate controller не инициализирован в тесте. Если вы хотите протестировать его, вы должны каким-то образом сделать так, чтобы он был инициализирован. - person runTarm; 17.08.2014
comment
да, но я должен найти еще как :) - person Whisher; 17.08.2014
comment
В модульном тесте вы должны тестировать только один модуль за раз — это означает, что только один контроллер. Напишите один тест, который проверяет, что первый контроллер излучает, и другой тест, который слушает другой контроллер. - person kvetis; 25.06.2015