单元测试angularjs指令的事件广播

时间:2015-05-18 03:28:26

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

我之前从未测试过angularjs指令,我为当前公司编写的指令也使用事件将指令传达给指令和服务。

所以我写了一个指令,例如搜索指令。

<m-search />

该指令广播"searchbox-valuechanged"事件和密钥,现在我必须为它编写测试。

'use strict';

describe('<m-search>', function() {

  beforeEach(module('hey.ui'));
  var rootScope;
  beforeEach(inject(function($injector) {
    rootScope = $injector.get('$rootScope');
    spyOn(rootScope, '$broadcast');
  }));

  it("should broadcast something", function() {
    expect(rootScope.$broadcast).toHaveBeenCalledWith('searchbox-valuechanged');
  });

});

更新 在改变输入时,

<input class="m-input m-input--no-border" type="search" placeholder="Search"
       ng-model="ctrl.searchValue"
       ng-model-options="{debounce: 100}"
       ng-change="ctrl.onChange({search: ctrl.searchValue})">

它调用指令控制器中的方法

vm.onChange = function (searchValue) {
  $rootScope.$broadcast('searchbox-valuechanged', {data: searchValue});
};

如何测试广播?

1 个答案:

答案 0 :(得分:3)

我是怎么做的......

describe('m-search directive', function() {
    var ctrl, // your directive's controller
        $rootScope; // a reference to $rootScope

    beforeEach(function() {
        // bootstrap your module
        module('hey.ui');

        inject(function($compile, _$rootScope_) {
            $rootScope = _$rootScope_;
            // see https://docs.angularjs.org/api/ngMock/function/angular.mock.inject#resolving-references-underscore-wrapping-

            // create an instance of your directive
            var element = $compile('<m-search></m-search')($rootScope.$new());
            $rootScope.$digest();

            // get your directive's controller
            ctrl = element.controller('mSearch');
            // see https://docs.angularjs.org/api/ng/function/angular.element#methods

            // spy on $broadcast
            spyOn($rootScope, '$broadcast').and.callThrough();
        });
    });

    it('broadcasts searchbox-valuechanged on change', function() {
        var searchValue = {search: 'search string'};
        ctrl.onChange(searchValue);

        expect($rootScope.$broadcast).toHaveBeenCalledWith(
            'searchbox-valuechanged', {data: searchValue});
    });
});

您会注意到这根本不依赖于您的指令模板。我不认为模板功能属于单元测试领域;这是使用量角器进行e2e测试的最佳选择。单元测试是关于测试组件的API,以确保他们做他们想要做的事情。