Использование TestComponentBuilder Angular 2 меня смущает

Я работаю над приложением Angular 2-rc3, и у меня настроено несколько юнит-тестов, и они работают, ура! Я просто не понимаю, почему они должны быть написаны именно так. И что еще более удивительно, все < a href="https://medium.com/google-developer-experts/angular-2-unit-testing-with-jasmine-defe20421584#.xwz347m87" rel="nofollow noreferrer"> примеры I см. имеют тот же подход. В частности, эти вопросы находятся в верхней части моего списка:

  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 есть createSync(), мы не можем использовать это? Я, конечно, попробовал и обнаружил, что сигнатуры функций различаются: createAsync(rootComponentType: Type) : Promise<ComponentFixture<any>> и createSync(componentFactory: ComponentFactory<C>) : ComponentFixture<C>. Зачем нам здесь фабрика компонентов, почему она нам не нужна при создании асинхронного компонента? // Обновление: RC4 отсутствует, и теперь createSync() принимает тип. Большой.

Мое здравомыслие уже благодарит вас!


person J.P. ten Berge    schedule 27.06.2016    source источник
comment
Обновление: журнал изменений для RC4 содержит это критическое изменение: compiler: TestComponentBuilder.createSync now takes a component type and throws if not all templates are either inlined are compiled before via createAsync.   -  person J.P. ten Berge    schedule 01.07.2016


Ответы (2)


Финальная версия Angular 2 выпущена, и класс TestComponentBuilder был заменен на TestBed, что меня гораздо меньше смущает.

person J.P. ten Berge    schedule 12.10.2016
comment
вот документы - person genuinefafa; 08.09.2017

  1. Тесты angular2-material прекрасно organized и настроить 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);
            });
    });
    
person Edd    schedule 27.06.2016
comment
Вы тестировали этот код? Ваш then содержит синтаксическую ошибку (f => { отсутствует). Одним из основных отличий моего кода является то, что вы используете injectAsync(), который я еще не пробовал, но, к сожалению, на моей машине результаты такие же, а then вообще не выполняется. Он исполняется вместе с вами? - person J.P. ten Berge; 29.06.2016
comment
Держи телефон! Я получаю реальную ошибку: No Directive annotation found on MyPipe. Хотя понятия не имею, почему. Мое приложение работает, но мой тест не может найти мою трубу? Тест находится в том же каталоге, что и моя трубка, import { MyPipe } from './my.pipe'; правильно... Странно. - person J.P. ten Berge; 29.06.2016