我正在开发一个Angular 2-rc3应用程序,我已经设置了一些单元测试,他们正在工作,是的!我只是不明白为什么他们必须按照他们的方式写作。更令人惊讶的是,all the examples I see具有相同的方法。具体来说,这些问题是我的首要问题:
为什么每个单元测试中都配置了TestComponentBuilder
?
it('shows list of blog items by default', inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
return tcb
.overrideProviders(BlogRoll, [provide(BlogService, {
useValue: mockBlogService
})])
.createAsync(BlogRoll)
.then((fixture) => {
// actual test code
});
});
每单位测试已经有七行代码,我的代码的可读性受此影响很大。我已尝试将其放在beforeEach()
:
beforeEach(inject([TestComponentBuilder], (tcb: TestComponentBuilder) => {
console.log('beforeEach');
return tcb.overrideProviders(BlogRoll, [provide(BlogService, {
useValue: mockBlogService
})])
.createAsync(BlogRoll)
.then(fixture => {
// this never gets printed
console.log('in then:', fixture.componentInstance);
});
}));
但是Karma似乎无法处理异步,then
中的所有内容都无法执行。这是一个错误还是这个错误,我们不应该这样做吗?
为什么这个组件的创建需要异步发生? TestComponentBuilder class上有一个createSync()
,我们不能使用它吗?我当然尝试过,发现函数签名不同:createAsync(rootComponentType: Type) : Promise<ComponentFixture<any>>
和createSync(componentFactory: ComponentFactory<C>) : ComponentFixture<C>
。为什么我们在这里需要一个组件工厂,为什么在创建组件异步时我们不需要它? //更新:RC4已关闭,createSync()
现在接受类型。大。
我的理智感谢你!
答案 0 :(得分:3)
Angular 2 final已发货,TestComponentBuilder
类已被TestBed取代,这让我感到困惑。
答案 1 :(得分:1)
angular2-material测试组织得很好,并在beforEach中设置TestComponentBuilder
,尽管他们仍然会为每个测试调用createAsync
。然后,您可以像这样嵌套createAsync
调用:
describe('Example', () => {
let fixture;
let builder: TestComponentBuilder;
beforeEach(injectAsync([TestComponentBuilder], (tcb: TestComponentBuilder) => {
builder = tcb;
builder.createAsync(ExampleComponent).then(
fixture = f;
});
});
it('Test 1', () => {
expect(fixture.componentInstance).not.toEqual(null);
});
});