0

.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.
4

1 に答える 1

1

アップデート:

$broadcast が呼び出されているかどうかを簡単にテストできます

expect(scope.$broadcast).toHaveBeenCalled()

または実際に $on をテストするには、次のようなことを行います

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

理由: $broadcast は実際には $on 関数を呼び出しません。$on は、イベント (最初の引数) をリッスンするときにコールバック関数 (2 番目の引数として渡される) を呼び出すリスナーです。


現在、スコープの $broadcast 関数をスパイしており、$on 関数をテストしています。交換する必要があります

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

spyOn(scope, '$on').and.callThrough();
于 2016-03-04T09:19:52.553 に答える