Angularjs 因果报应/茉莉花/有棱角的托福被称为真正的因果报应

Angularjs 因果报应/茉莉花/有棱角的托福被称为真正的因果报应,angularjs,jasmine,karma-runner,karma-jasmine,angular-mock,Angularjs,Jasmine,Karma Runner,Karma Jasmine,Angular Mock,例如,在我的应用程序中,我有 $rootScope.$emit('loggedin',data.user); $rootScope.$on('loggedin', function(event,user) { console.log('called'); }); 在我的测试中 spyOn($rootScope, '$emit'); var response = { "success":1, "user":{ "id":1,

例如,在我的应用程序中,我有

$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":"lama@test.test",
        "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是否从未被触发
或者我错过了一些东西。

如果您希望调用真正的
$emit()
,则必须在
spyOn
之后显式设置它,如下所示:

spyOn($rootScope, '$emit').and.callThrough();
或者在Jasmine 1.3中:

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

希望这能有所帮助。

我刚刚尝试了.andCallThrough();但我一直没有看到“called”,嗯,似乎存在$rootScope问题,因为如果我将$on侦听器放在运行块中,那么您的
$emit
$on
是否真的按顺序排列?如果是,这就是原因,您试图在订阅事件之前发出事件。尝试将
$on
移动到
$emit
之前。我在一个单独的控制器中有$on,控制器中的$emit连接到路由。我不明白为什么它在应用程序中有效,而在测试中无效。测试中似乎没有初始化您的
独立控制器。如果你想测试它,你必须以某种方式使它被初始化。