我正在尝试测试在根模块的另一个子模块的子模块中定义的指令。我无法访问在指令控制器中定义的范围变量。问题似乎在于从测试内部访问范围。
主模块名为stateEditorModule
,它有一个名为stateContentEditorModule
的子模块,并且该子模块还有一个名为$scope
的子模块。我尝试注入$rootScope
而不是 beforeEach(function() {
module('oppia');
module('stateEditorModule');
module('stateContentEditorModule');
});
outerScope = $rootScope.$new();
var elem = angular.element(
'<state-content-editor>' +
'</state-content-editor>');
var compiledElem = $compile(elem)(outerScope);
outerScope.$digest();
ctrlScope = compiledElem[0].getControllerScope();
}));
fit('should start with the content editor not being open', function() {
expect(ctrlScope.contentEditorIsOpen).toBe(false);
});
,但似乎不起作用。
这是测试代码:
contentEditorIsOpen
contentEditorIsOpen
变量是在指令的作用域中定义的。
{{1}}无法用代码的当前状态访问。
我坚持了很长时间,如果有人可以提供解决方案或指向有关如何测试多模块AngularJS应用程序的文档,我将不胜感激。
答案 0 :(得分:0)
通常,您不会测试指令本身。相反,您将测试该指令的控制器。
这意味着您需要在DI中注册控制器。然后,您可以直接通过DI获取该指令的控制器(无需创建和编译该指令),为该控制器提供初始范围,调用函数,并将该范围内的某些var声明为特定值。
文档中的示例: https://docs.angularjs.org/guide/unit-testing#testing-a-controller
如果您使用组件而不是指令,请检查以下内容: https://docs.angularjs.org/guide/component#unit-testing-component-controllers
更新:
我使用了指令的controllerAs属性为控制器命名为stateContentEditorController
controllerAs
仅在模板范围内为该控制器创建一个别名,但不会在DI(依赖注入)模块中注册它,因此您无法从DI系统中检索它。
我的建议是分别编写指令和控制器,并使用angular.module('moduleName').controller('controllerName', [...])
注册控制器。然后,在指令定义对象中只需编写{controller: 'controllerName', ...}
。这样,您可以在测试中检索控制器。