import { Observable } from 'rxjs'; interface ObservableTester { observable: Observable; done: jest.DoneCallback; } interface SubscribeAndExpectOnNext extends ObservableTester { expect: (value: T) => void; } interface SubscribeAndExpectOnComplete extends ObservableTester { expect: () => void; } interface SubscribeAndExpectOnError extends ObservableTester { expect: (err: any) => void; } export const observableTester = () => { const subscribeAndExpectOnNext = ({ observable, expect, done }: SubscribeAndExpectOnNext): void => { observable.subscribe({ next: value => { try { expect(value); } catch (err) { done.fail(err); } }, error: err => done.fail(err), complete: () => done(), }); }; const subscribeAndExpectOnComplete = ({ observable, expect, done }: SubscribeAndExpectOnComplete): void => { observable.subscribe({ next: () => {}, error: err => done.fail(err), complete: () => { try { expect(); done(); } catch (err) { done.fail(err); } }, }); }; const subscribeAndExpectOnError = ({ observable, expect, done }: SubscribeAndExpectOnError): void => { observable.subscribe({ next: () => {}, error: err => { try { expect(err); done(); } catch (err) { done.fail(err); } }, complete: () => { done(); }, }); }; return { subscribeAndExpectOnNext, subscribeAndExpectOnComplete, subscribeAndExpectOnError }; };