Вы возвращаете наблюдаемое, на которое никогда не подписывается ваш тест. Акт подписки на возвращаемое наблюдаемое запускает логику в
.pipe(
take(2),
tap((val) => console.log(val)),
filter(isUnique => isUnique !== undefined),
map(isUnique => isUnique ? null : {usernameIsNotUnique: true}),
)
Вам необходимо проверить выбранное значение из возвращаемой наблюдаемой.
let validationResult;
const sub = UniqueUsernameValidator(storeMock)(control.value).subscribe(result => {
validationResult = result;
});
sub.unsubscribe();
expect(validationResult.usernameIsNotUnique).toEqual(true);
Если вы знаете, что наблюдаемая была создана из вас, вы можете развернуть ее таким образом, но если наблюдаемая была асинхронной, вам нужно будет выполнить асинхронный тест.
Я использую эту вспомогательную функцию для асинхронного тестирования наблюдаемых.
import { Observable, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
export async function firstEmitted<T>(obs$: Observable<T>): Promise<T> {
return new Promise<T>(resolve => {
const finalise = new Subject<void>();
obs$.pipe(takeUntil(finalise)).subscribe(value => {
finalise.next();
resolve(value);
});
});
}
и используйте его как
it('should dispatch an action of CheckUsername', async(async () => {
const validationResult = await firstEmitted(UniqueUsernameValidator(storeMock)(control.value));
expect(validationResult.usernameIsNotUnique).toEqual(true);
}));
The
async(async () =>
смущает некоторых людей, но первая асинхронная функция - это асинхронная функция из модуля углового тестирования, утверждающая, что тестовая функция является функцией anync, а вторая помечает функцию как асинхронную, поскольку мы используем в ней оператор await.