我不确定我所做的事情是完全错误的,但当我从"指令"到"组件"为了定义我的一些HTML元素,我突然打破了所有的Karma测试。这就是我所拥有的:
karam.conf.js
...
preprocessors: {
'module-a/module-a.view.html': ['ng-html2js'],
...,
'module-z/module-z.view.html': ['ng-html2js']
},
ngHtml2JsPreprocessor: {
moduleName: 'theTemplates'
},
...
模块a.component.js
(function(){
"use strict";
angular.module('ModuleA').component('moduleAComponent',{
controller: 'ModuleAController as moduleAVm',
templateUrl: 'module-a/module-a.view.html'
});
})();
模块-A-tests.js
"use strict";
describe('ModuleA',function(){
beforeEach(module('ModuleA'));
describe('Controller',function(){
...
});
describe('Component',function(){
var element, $rootScope;
beforeEach(module('theTemplates'));
beforeEach(inject([
'$compile','$rootScope',
function($c,$rs) {
$rootScope = $rs;
element = $c('<module-a-component></module-a-component>')($rootScope);
$rootScope.$digest(); // ???
}
]));
it('should have moduleAVm',function(){
expect(element.html()).not.toBe(''); // FAILS HERE
expect(element.html()).toContain('moduleVm'); // FAILS HERE TOO
});
});
});
错误:
Expected '' not to be ''.
答案 0 :(得分:3)
好的,在更彻底地阅读Angular的documentation后,我发现了这句话:
对元件控制器进行单元测试的最简单方法是使用 $ componentController包含在ngMock中。这样做的好处 方法是您不必创建任何DOM元素。该 以下示例显示了如何为heroDetail组件执行此操作 从上面。
它突然出现在我身上,我的描述('Controller',function(){...});是我真正需要改变的,我应该摆脱'组件'部分,正式称为'指令'
现在这是我的'控制器':
beforeEach(inject([
'$componentController', // replaced $controller with $componentController
function($ctrl){
ctrl = $ctrl('queryResults',{ // Use component name, instead of controller name
SomeFactory:MockSomeFactory,
SomeService:MockSomeService
});
}
]));
现在,我仍然可以测试我的控制器,同时测试组件。而且我不再需要使用$ compile,$ rootScope等创建DOM元素。