Как проверить многократную подписку в Angular? - PullRequest
0 голосов
/ 13 марта 2020

В моем Angular модульном тесте я хочу проверить, есть ли у myComponent.items$ 0 результатов, когда я вызываю субъекта myComponent.clearInput$.next(). До этого я хочу убедиться, что есть некоторые записи. myComponent.items$ может быть заполнено myComponent.nameInput$.next("test").

К сожалению, обе подписки срабатывают после вызова обоих субъектов, поэтому myComponent.items$ всегда равно 0.

it("when control touched then clear input value", done => {

    myComponent.items$.pipe(first()).subscribe(result => {
        expect(result.length).toBe(2); 
        // it's always 0 because of myComponent.clearInput$.next(); from last line
    })
    myComponent.nameInput$.next("test");

// Now should wait after code from above will finish then the rest should be executed after that.

    myComponent.items$.pipe(first()).subscribe(result => {
        expect(result.length).toBe(0);
        done(); // test should be finished here
    })
    myComponent.clearInput$.next();
});

This как предметы называются этими предметами

this.items$ = merge(
    this.nameInput$.pipe(
        switchMap((name: string) =>
            iif(() => this._partyType === "PT",
                this.someService.getByName(name),
                this.otherService.getByOtherName(name)
            )
        )
    ),
    this.clearInput$.pipe(
        switchMapTo(of([]))
    )
);

1 Ответ

0 голосов
/ 13 марта 2020

В моих юнит-тестах я редко subscribe. Я использую promise подход, потому что тогда я могу ждать.

Попробуйте это:

it("when control touched then clear input value", async done => {
   myComponent.nameInput$.next("test");
   console.log('first await...');
   const result = await myComponent.items$.pipe(take(1)).toPromise();
   console.log('after first await...');
   expect(result.length).toBe(2);

   myComponent.clearInput$.next();
   console.log('second await...');
   const newResult = await myComponent.items$.pipe(take(1)).toPromise();
   console.log('after second await...');
   expect(newResult.length).toBe(0);
   done();
});

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

...