在指令中测试.on期望间谍得到了功能

时间:2016-03-04 09:11:06

标签: angularjs unit-testing jasmine karma-jasmine angular-broadcast

我试图通过.on来测试我的指令中的$ broadcast(来自控制器)的接收器。

指令:

describe('<-- myDirective Spec ------>', function () {

    var scope, $compile, element, $httpBackend, rootScope;

    beforeEach(angular.mock.module('myApp'));

    beforeEach(inject(function (_$rootScope_, _$compile_, _$httpBackend_) {
        scope = _$rootScope_.$new();
        $compile = _$compile_;
        $httpBackend = _$httpBackend_;
        rootScope = _$rootScope_;

        var html = '<my-directive></my-directive>';
        element = $compile(angular.element(html))(scope);

        spyOn(scope, '$broadcast').and.callThrough();
        scope.$digest();
    }));

    it('should be defined', function () {
        expect(element).toBeDefined();
    });

    it('should broadcast ', function () {
        scope.$broadcast('sendEmail');
        expect(scope.$on).toHaveBeenCalledWith('sendEmail', jasmine.any(Function));
    });
});

有了上述内容,我收到错误:

Expected a spy, but got Function.

1 个答案:

答案 0 :(得分:1)

<强>更新

您可以简单地测试是否使用

调用$ broadcast
expect(scope.$broadcast).toHaveBeenCalled()

或实际测试$ on做类似

的事情
scope.$on('sendEmail', spyFunction)
expect(spyFunction).toHaveBeenCalledWith('sendEmail')

原因:$ broadcast实际上并没有在函数上调用$。 $ on是一个侦听器,它在侦听事件(第一个参数)时调用回调函数(作为第二个参数传递)。

您目前正在监视范围的$ broadcast功能,并对$ on功能进行了测试。你需要替换

spyOn(scope, '$broadcast').and.callThrough();

通过

spyOn(scope, '$on').and.callThrough();