spyOn $ scope。$ on on broadcast toHaveBeenCalled失败

时间:2014-08-16 04:50:22

标签: angularjs unit-testing events angularjs-scope jasmine

我在使这个简单的测试工作时遇到了很多麻烦。

我想要测试的控制器中有一个$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(),但似乎没有任何效果。

这是怎么做到的?

1 个答案:

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