使用Angular 2的TestComponentBuilder让我很困惑

时间:2016-06-27 13:41:51

标签: angular angular2-testing

我正在开发一个Angular 2-rc3应用程序,我已经设置了一些单元测试,他们正在工作,是的!我只是不明白为什么他们必须按照他们的方式写作。更令人惊讶的是,all the examples I see具有相同的方法。具体来说,这些问题是我的首要问题:

  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似乎无法处理异步,then中的所有内容都无法执行。这是一个错误还是这个错误,我们不应该这样做吗?

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

  3. 我的理智感谢你!

2 个答案:

答案 0 :(得分:3)

Angular 2 final已发货,TestComponentBuilder类已被TestBed取代,这让我感到困惑。

答案 1 :(得分: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);
            });
    });