Angularjs 如何在角度指令中测试控制器

Angularjs 如何在角度指令中测试控制器,angularjs,angularjs-directive,jasmine,Angularjs,Angularjs Directive,Jasmine,我正在编写指令,希望添加单元测试。 我想编写测试: 它“当指令被创建时消息变量被定义” 它“当创建指令时,它不包含任何消息” 它“当调用消息时,它将向堆栈中添加新消息” 我的指令代码如下 app.directive("message", function () { return { transclude: false, require: '^ngModel', templateUrl: 'notificationBar.html', scope: {

我正在编写指令,希望添加单元测试。 我想编写测试:

它“当指令被创建时消息变量被定义” 它“当创建指令时,它不包含任何消息” 它“当调用消息时,它将向堆栈中添加新消息” 我的指令代码如下

app.directive("message", function () {
return {
    transclude: false,
    require: '^ngModel',
    templateUrl: 'notificationBar.html',
    scope: {
        message: '@'
    },
    controller: function ($scope) {  

        $scope.messages = [];

        $scope.addMessage=function(message){
            $scope.messages.push(message);
        }                           
    }
}
})

和我的测试,但我不知道为什么这不起作用

describe("messageSpec", function(){
var element;
var $scope;
var ctrl;

beforeEach(module(app));
beforeEach(inject(function($compile, $controller, $rootScope){
    var elm = angular.element(' <div data-message data-message="{{ message }}" >');
    $scope = $rootScope;
    element = $compile(elm)($scope);
    $scope.$digest();

    ctrl = element.controller("message");
}));

describe("test", function(){
   it('When directive is created messages variable is defined', function(){
       spyOn(ctrl,messages);

       expect(ctrl.messages).toBeDefined(); 
   });
   it('When directive is created it contains no messages',function(){
     spyOn(ctrl,messages);

     expect(ctrl.messages.length).toBe(0);
   });
   it('When message is called it will add new message to stack', function(){
     // todo
   });

});

}) $scope.addMessagemessage{..处的控制器函数中存在语法错误,因此我只是猜测并修复它。 在控制器中,消息被放入$scope中,而不是控制器实例本身,但在测试用例中,您在控制器实例中查找消息。 message指令有一个独立的作用域,因此传递到$compile中的$scope不能针对这两个指令进行测试。 作为一种解决方法,您可以使用angular.element…isolateScope来获取用于测试的隔离范围。 工作测试用例应如下所示:

describe("messageSpec", function() {
  var element;
  var $scope;
  var isolateScope;

  beforeEach(module("myApp"));
  beforeEach(inject(function($compile, $controller, $rootScope) {
    var elm = angular.element('<div data-message="{{ message }}">');
    $scope = $rootScope;
    element = $compile(elm)($scope);
    $scope.$digest();

    isolateScope = element.isolateScope();
  }));

  describe("test", function() {
    it('When directive is created messages variable is defined', function() {
      expect(isolateScope.messages).toBeDefined();
    });

    it('When directive is created it contains no messages', function() {
      expect(isolateScope.messages.length).toBe(0);
    });

    it('When message is called it will add new message to stack', function() {
      // todo
    });
  });
});

有关完整示例,请参见:

在预览中,我得到错误:模块未定义。你知道为什么吗?你在我的plunker中看到错误了吗?它对我来说很好。如果是,你使用的是哪个浏览器?我使用的是chrome,得到的错误是:ReferenceError:module未在套件中定义。模块变量来自Angle-mocks.js。请检查devtools中的“网络”选项卡,以确保成功加载文件。