У меня есть служба, которая создает наблюдаемое, которое излучает значения, и сравнительно легко проверить, соответствует ли полученное значение ожидаемому.
Например:
describe('service', () => {
beforeEach(() => {
TestBed.configureTestingModule({providers: [MyService]});
});
it('should emit true', async(() => {
const service = TestBed.get(MyService);
service.values$.subscribe((value) => expect(value).toBeTruthy());
}));
});
Выше работаетдля проверки ожидаемого значения, но оно работает только в том случае, если служба фактически выдает значение.Если у вас есть крайний случай, когда службе не удается передать значение, тогда сам тест фактически проходит, и Жасмин записывает в журнал предупреждающее сообщение «СПЕЦИАЛЬНО НЕ ДОЛЖНЫ ОЖИДАТЬСЯ».
Я некоторое время искал в Googleчтобы понять, как отловить этот случай как ошибку и придумать этот подход.
it('should emit true', async(() => {
const service = TestBed.get(MyService);
let value;
service.values$.subscribe((v) => value = v);
expect(value).toBeTruthy();
}));
Вышеописанное работает только для синхронных наблюдаемых и ощущается как запах кода для меня.Другой разработчик увидит это и подумает, что это тест низкого качества.
Итак, подумав об этом в течение нескольких дней.Я подумал об использовании takeUntil()
, чтобы заставить наблюдаемое завершить и затем протестировать ожидаемый результат.
Например:
describe('service', () => {
let finished: Subject<void>;
beforeEach(() => {
TestBed.configureTestingModule({providers: [MyService]});
finished = new Subject();
});
afterEach(() => {
finished.next();
finished.complete();
});
it('should emit true', async(() => {
const service = TestBed.get(MyService);
let value;
service.changes$
.pipe(
takeUntil(finished),
finalize(() => expect(value).toBeTruthy())
)
.subscribe((v) => value = v);
}));
});
В приведенном выше примере значение сохраняется влокальная переменная, а затем ожидаемый результат проверяется, когда наблюдаемое завершается.Я форсирую завершение, используя afterEach()
с takeUntil()
.
Вопрос:
Есть ли какие-либо побочные эффекты с моим подходом, и если да, то каковы будутУгловой / Жасмин способ выполнения этих видов испытаний.Меня беспокоит, что вы не должны выполнять ожидайте утверждений во время afterEach () вызова жизненного цикла.