如何在单元测试中访问AngularJS控制器的某些实例(AS-syntax)?

时间:2016-02-17 12:09:49

标签: angularjs unit-testing

我正在为一组Angular指令编写集成测试。 每个指令验证一个或多个字段。例如,要使红色和蓝色字段有效,需要检查它们。

完整代码(包含非测试部分)可用here

问题是在单元测试中我不知道如何访问受验证指令影响的MainController的特定实例:

var html = "" +
"<form ng-controller='MainController as main'>" +
"    <input type='checkbox' ng-model='main.red' red-validator='main'>" +
"    <input type='checkbox' ng-model='main.blue' blue-validator='main'>" +
"</form>"

describe('validator directives', function(){

  beforeEach(function(){
    module('myApp', function($controllerProvider){
        $controllerProvider.register('MainController', MainController);
    });
  });

  it('validate and invalidate fields', function(){
    inject(function($controller, $compile, $rootScope){
        var scope = $rootScope.$new();
      var element = $compile(html)(scope);
      var target = $controller('MainController');

      scope.$apply(function(){
        target.red = true;
        target.blue = true;
      });

      expect(target.redIsValid).toBe(true);
      expect(target.blueIsValid).toBe(true);

      scope.$apply(function(){
        target.red = false;
      });

      expect(target.redIsValid).toBe(false);
      expect(target.blueIsValid).toBe(false);
    });
  });
});

$ controller('MainController')构造一个新实例,因此测试失败,因为它没有设置它正在从正确的实例中读取值。有没有办法让这个特定的实例?

PS。我想避免将控制器属性移动到$ scope只是为了让测试工作。

1 个答案:

答案 0 :(得分:1)

可以使用

检索控制器实例
var ctrl = html.controller('ngController');