【发布时间】:2016-06-28 19:16:31
【问题描述】:
如何在 jasmine 测试中模拟子组件?
我有MyComponent,它使用MyNavbarComponent 和MyToolbarComponent
import {Component} from 'angular2/core';
import {MyNavbarComponent} from './my-navbar.component';
import {MyToolbarComponent} from './my-toolbar.component';
@Component({
selector: 'my-app',
template: `
<my-toolbar></my-toolbar>
{{foo}}
<my-navbar></my-navbar>
`,
directives: [MyNavbarComponent, MyToolbarComponent]
})
export class MyComponent {}
当我测试这个组件时,我不想加载和测试这两个子组件; MyNavbarComponent,MyToolbarComponent,所以我想模拟一下。
我知道如何使用provide(MyService, useClass(...)) 模拟服务,但我不知道如何模拟指令;组件;
beforeEach(() => {
setBaseTestProviders(
TEST_BROWSER_PLATFORM_PROVIDERS,
TEST_BROWSER_APPLICATION_PROVIDERS
);
//TODO: want to mock unnecessary directives for this component test
// which are MyNavbarComponent and MyToolbarComponent
})
it('should bind to {{foo}}', injectAsync([TestComponentBuilder], (tcb) => {
return tcb.createAsync(MyComponent).then((fixture) => {
let DOM = fixture.nativeElement;
let myComponent = fixture.componentInstance;
myComponent.foo = 'FOO';
fixture.detectChanges();
expect(DOM.innerHTML).toMatch('FOO');
});
});
这是我的 plunker 示例;
【问题讨论】:
-
组件工作正常,你的问题是另一回事。例如,您正在导入
MyNavbarComponent,但在您的组件类中称为myNavbarComponent。注意小写的m,它会导致失败。如果你大写它会正常工作。 -
感谢@EricMartinez,我修复了小写字母并且测试有效。但是,我的问题对于如何模拟组件仍然有效。我正在测试
MyComponent,不是MyNavbarComponent,也不是MyToolbarComponent -
是的,很抱歉。你可以看看这个spec,看看他们是如何模拟组件的。
-
@EricMartinez,谢谢。我发布了从您的 commnet 中学到的自己的答案。所有功劳归您所有。
标签: unit-testing testing jasmine angular components