Правильное тестирование наблюдаемого для простого компонента - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я тестирую созданный мной простой компонент, который выглядит следующим образом:

@Input()
public type: string;

private saveSubscription: Subscription;

public ngOnDestroy(): void {
    this.saveSubscription.unsubscribe();
}

public ngOnInit(): void {
    this.onSave();
}

private onSave(): void {
    this.saveSubscription = this.editService.saveSelection.subscribe(() => {
        this.editService.type.next(this.type);
    });
}

В моем тесте я хочу убедиться, что если я установлю ввод вручную, а затем вызову ngOnInit(), значение, излучаемое editService, будет равно моему значению.

it('should set up the subscription for saving', fakeAsync(() => {
    // Arrange
    component.type = 'full';

    // Act
    component.ngOnInit();
    fixture.detectChanges();

    mockedEditService.saveSelection.next();

    // Assert
    mockedEditService.type.subscribe(type => {
        expect(type).toEqual(component.type);
    });
}));

Я борюсь с тестированием асинхронного кода и не уверен, правильно ли я это делаю. Тест всегда проходит даже при неправильных тестовых случаях, и я подозреваю, что рассматриваемый код не ожидает разрешения подписки, прежде чем сделать свое утверждение.

Чтение англоязычных тестовых документов , я смог немного больше познакомиться, но мне было интересно, есть ли у вас какие-либо предложения.

Спасибо

1 Ответ

0 голосов
/ 02 мая 2018

В spec введите subscription перед mockedEditService.saveSelection.next

it('should set up the subscription for saving', fakeAsync(() => {
    // Arrange
    component.type = 'full';

    // START ********* MOVE THIS BLOCK UP
    mockedEditService.type.subscribe(type => {
        expect(type).toEqual(component.type);
    });
    // END ********* MOVE THIS BLOCK UP

    // Act
    component.ngOnInit();
    fixture.detectChanges();

    mockedEditService.saveSelection.next();


}));
...