Angular / Jasmine:使用和不使用匿名函数包装器传递给$ rootScope。$ on的方法

时间:2015-11-05 16:44:01

标签: javascript angularjs jasmine karma-jasmine

在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 = ''; } } }); 传递的角度函数。如果是这样,怎么样?如果没有,为什么不呢?

1 个答案:

答案 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();
});

举例说明:

enter image description here

因此,如果在调用spyOn()之前可以使用您正在监视的功能,则可以先尝试调用$rootScope.$on()。否则,你需要包装器。