Конкретный пример Rxjs TestScheduler/RunHelper
Я смотрел видео и читал статьи, но пока они все либо выше моего понимания, либо слишком упрощены. (Ищу хорошее практическое объяснение типа Златовласки здесь.)
У меня есть служба angular, которая имеет наблюдаемое свойство, например, где свойство, которое я хочу проверить, таково:
@Injectable()
export class MyMessageService {
private messageSubj = new BehaviorSubject("");
public message$ = this.messageSubj.pipe(filter(msg => !!msg));
public someFunction(msg: string): void {
this.messageSubj.next(msg);
}
}
не должен излучать вообще, пока субъект каким-то образом не станет следующим.
Все тесты, которые я нашел (по крайней мере, которые имеют для меня смысл), определяют 3 наблюдаемых: a ,
expected$
, а также
result$
, затем сравнивая последние 2, таким образом:
it("should be easier to test than this", () => {
scheduler.run((helpers: RunHelpers) => {
const source$ = helpers.cold("-a-b|", { a: "", b: "hello" });
const expected$ = helpers.cold("---b|", { b: "hello" });
const result$ = source$.pipe(filter(x => !!x));
helpers.expectObservable(result$).toEqual(expected$);
});
});
Теперь, если я хочу протестировать свою службу
message$
наблюдаемый, как бы я изменил приведенный выше тест? Я бы заменил
source$
с
const source$ = myService.message$
? Это правильно?
Если я это сделаю, я смогу проверить, что он НЕ излучает (ВАУХУ!). Но как я могу проверить это так, чтобы в точке «а» источник не излучал, а либо раньше, либо в точке «б» я вызываю
myService.someFunction("hello")
чтобы в «b» значение было «привет»?
Спасибо!
1 ответ
Я не уверен в тестовом примере, который вы нашли; Я бы проверил, чтобы выдать какое-то значение желания, подобное этому:
it('should emit a value when calling someFunction function', () => {
service.someFunction('Hello');
// success
service.message$.subscribe((message) => expect(message).toEqual('Hello'))
})
it('should not emit any value from messages$', () => {
// success, although is missing expectations
service.message$.subscribe((message) => expect(message).toBeUndefined())
})
message$ вообще не должен выдаваться, пока субъект каким-то образом не станет следующим.
message$
вообще не должен излучать, если никто не подписывается на наблюдаемый, даже если я позвоню
someFunction
следующее значение, если никто не подписан на
messages$
, то он ничего не излучает.
Если я это сделаю, я смогу проверить, что он НЕ излучает (ВАУХУ!).
Правильно, так как никто не подписывается на
$messages
, значение не выдается