我在使这个简单的测试工作时遇到了很多麻烦。
我想要测试的控制器中有一个$scope.$on
侦听器。我只是想确定它是在广播事件之后调用的。
为此,我认为以下代码可行:
describe("Testing the parent controller: ", function() {
var scope, ctrl;
beforeEach(function() {
module("myApp");
inject(function($rootScope, $controller) {
scope = $rootScope.$new();
ctrl = $controller('parent-ctrl', {
$scope: scope,
});
});
});
it ("should trigger broadcast when current page updates", function() {
spyOn(scope, "$on");
scope.$broadcast("myEvent", 999);
expect(scope.$on).toHaveBeenCalled();
});
});
它没有(Expected spy $on to have been called.
)。我通过大量的例子挖掘出来:
并且学到了很多东西,但由于某种原因,我并没有做出一些重要的联系。
我注意到$on
处理程序确实响应了后断言,这是无益的。我在各种配置中尝试了scope.$apply()
和.andCallThrough()
,但似乎没有任何效果。
这是怎么做到的?
答案 0 :(得分:8)
当广播事件时,它是在$on
注册的侦听器函数,而不是$on
函数本身。
您当前的测试适用于此类代码,这可能不是您所拥有的:
$scope.$on('myEvent', function () {
$scope.$on('whatever', someFn);
});
您应该测试的是您注册的监听器功能正在做什么。
所以,例如你有:
$scope.$on('myEvent', function() {
myFactory.doSomething();
});
像这样测试:
spyOn(myFactory, "doSomething");
scope.$broadcast("myEvent");
expect(myFactory.doSomething).toHaveBeenCalled();