如何单元测试从控制器绑定的指令

时间:2013-12-02 12:50:27

标签: unit-testing angularjs karma-runner

我有一个简单的指令,只是简单地来自控制器的绑定。

我的单元测试代码未运行。有什么想法吗?

HTML:

<div ng-controller="MainCtrl as main">

    <div uppercase>{{main.message}}</div>

</div>

控制器:

app.controller('MainCtrl', function(){
    this.message = 'hello world'
})

指令:

app.directive('uppercase', function($timeout) {
    return {
        restrict: 'A',
        transclude: true,
        template: '<span ng-transclude></span>',
        link: function(scope, el, attr) {
            $timeout(function(){
                el.text(el.text().toUpperCase());
            });
        }
    }
});

我的单元测试目前是:

describe("App", function() {

    var $compile
    ,   $rootScope
    ,   $controller
    ,   MainCtrl
    ,   element;

  beforeEach(module('app'))

  beforeEach(inject(function(_$compile_, _$rootScope_, _$controller_){

    $compile = _$compile_;
    $rootScope = _$rootScope_;
    $controller = _$controller_;

    MainCtrl = $controller('MainCtrl');



  }))

  describe("MainCtrl", function() {
    it("should have a message property", function() {
      expect(MainCtrl.message).toBe('hello world');
    });
  });

  describe("Uppercase directive", function() {
    it("should return uppercase text", function() {      

      element = '<p superman>{{MainCtrl.message}}</p>';

      element = $compile(element)($rootScope);

      $rootScope.$digest();

      expect(element.text()).toBe('HELLO WORLD');
    });
  });


});

我的测试中不能使用$ timeout,那么我应该如何测试呢?

1 个答案:

答案 0 :(得分:0)

我还没有对它进行测试,但我相信在expect(element.text()).toBe('HELLO WORLD');之前,您必须清除超时。

我的意思是,你有一个名为$ timeout的额外变量(在beforeEach中)然后,在上面提到的预期之前,你要调用$ timeout.flush()。