我正在为一组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只是为了让测试工作。
答案 0 :(得分:1)
可以使用
检索控制器实例var ctrl = html.controller('ngController');