在angular中,当$rootScope.$on('someEvent', some.method);
侦听的事件被触发时,我正在调用方法。
spyOn(some, 'method');
$rootScope.$broadcast('someEvent');
expect(some.method).toHaveBeenCalled(); // fails
我在我的茉莉花测试中监视方法,从我的测试中触发事件,然后检查方法是否被调用。
$rootScope.$on('someEvent', function () { some.method(); });
此测试失败。此外,实际调用该方法(通过控制台日志验证)。
现在,我可以将方法包装在一个匿名函数中,如下所示:
spyOn(some, 'method');
$rootScope.$broadcast('someEvent');
expect(some.method).toHaveBeenCalled(); // passes
测试通过。
$rootScope.$on
在这种情况下,实际上并没有调用方法本身(正如预期的那样,因为它被监视)。
我已经设置了一套测试来充分说明这个Plunk:http://plnkr.co/edit/3S5J47OeCBsL0RASGe5P?p=preview
当事件触发时,无论是否包含在匿名函数中,都会调用传递给$rootScope.$on
的方法。但是,间谍只有在匿名函数中包含时才会注册。
在jasmine中,是否可以成功窥探通过引用var mySub;
Template.pesquisar.events({
"keypress input": function(event, template) {
if (event.keyCode == 13) {
var search = {};
search.value = event.target.value
search.name = event.target.name
if ( mySub ) mySub.stop(); // if you've previously subscribed clear those results
mySub = Meteor.subscribe("pesquisaEquipamentos", search);
event.target.value = '';
}
}
});
传递的角度函数。如果是这样,怎么样?如果没有,为什么不呢?
答案 0 :(得分:2)
spyOn()是一个改变者。我forked your Plunk并添加了一些控制台日志。
考虑注册间谍的调用:
spyOn(test, 'bar').andCallThrough();
这会创建一个新的间谍功能来执行间谍工作,然后调用间谍功能。然后将间谍存储在对象上以代替原始功能。在您的“无匿名包装”示例中,您注册事件以在注册间谍时调用test.bar
值的函数:
$rootScope.$on('withoutFunctionWrapper', test.bar);
对于包装器,事件将触发事件发生时test.bar
设置为的任何内容,在您的情况下是间谍:
$rootScope.$on('withFunctionWrapper', function() {
test.foo();
});
举例说明:
因此,如果在调用spyOn()
之前可以使用您正在监视的功能,则可以先尝试调用$rootScope.$on()
。否则,你需要包装器。