Конкретный пример 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, значение не выдается

Другие вопросы по тегам