【发布时间】:2017-05-05 16:53:03
【问题描述】:
我正在尝试为 Angular 1.5 中的组件编写单元测试。我想对该组件及其 dom 节点进行单元测试。该组件包含一个相当复杂的子组件。
我的目标是在不编译子组件的情况下对外部组件进行单元测试。
因为我也想测试 DOM,所以在这个测试中使用 $componentController 是不够的。
这是我想要实现的一个简短示例:
组件代码:
angular.module('app').component('myComponent', {
bindings: {
username: '<',
},
template: `
<span>{{ $ctrl.username }}</span>
<my-complex-component />
`
controller: function () {}
});
我的组件的单元测试:
it('my-component should render username', function () {
var template = '<my-component username="username"></my-component>',
element,
scope,
date;
scope = $rootScope.$new();
scope.username = 'John';
element = $compile(template)(scope);
scope.$digest();
username = element.find('span');
expect(username.text()).to.be.equal('John');
});
my-complex-component 不应被实例化。它应该按原样抵抗模板。在单元测试中创建元素应该会导致
<span>John</span>
<my-complex-component />
有什么办法吗?
【问题讨论】:
-
据我所知,它完全符合您的预期。当您编译组件时,它不会编译内部组件。看看
console.log(element)。 -
不幸的是,my-component 和 my-complex-component 都位于模块 app.由于我必须调用 angular.mock.module('app') 来模拟模块,它会加载两个组件并尝试编译 my-complex-component。
-
你可以尝试模拟
my-complex-component。请参阅 this answer 模拟指令,但请改用 $compileProvider.component
标签: angularjs unit-testing mocking components