如何在模块化angularjs范围内测试指令?

时间:2019-04-15 12:14:22

标签: angularjs unit-testing angularjs-scope karma-jasmine modularity

我正在尝试测试在根模块的另一个子模块的子模块中定义的指令。我无法访问在指令控制器中定义的范围变量。问题似乎在于从测试内部访问范围。

主模块名为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应用程序的文档,我将不胜感激。

1 个答案:

答案 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', ...}。这样,您可以在测试中检索控制器。