2

我正在开发一个 Angular 2-rc3 应用程序,我设置了一些单元测试,它们正在工作,是的!我只是不明白为什么必须按照他们的方式编写它们。更令人惊奇的是,看到所有 例子都有相同的方法。具体来说,这些问题是我的首要问题:

  1. 为什么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 似乎无法处理异步,thenjust 中的所有内容都没有被执行。这是一个错误还是这是故意的,我们不应该这样做吗?

  2. 为什么这个组件的创建需要异步发生?TestComponentBuilder 类createSync()上有一个,我们不能使用它吗?当然我试过了,发现函数签名不同:和. 为什么我们这里需要一个组件工厂,为什么我们在创建组件异步时不需要它?// 更新:RC4 已经发布,现在接受一个类型。伟大的。createAsync(rootComponentType: Type) : Promise<ComponentFixture<any>>createSync(componentFactory: ComponentFactory<C>) : ComponentFixture<C>createSync()

我的理智已经谢谢你了!

4

2 回答 2

3

Angular 2 final 已经发布,TestComponentBuilder该类已被TestBed取代,这让我少了很多困惑。

于 2016-10-12T12:22:22.303 回答
1
  1. angular2 -material测试组织得很好,并TestComponentBuilder在beforEach 中设置,尽管它们仍然需要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);
            });
    });
    
于 2016-06-27T19:33:44.613 回答