单元测试:模拟服务 returns observables to return subjects 以测试值随时间的变化导致 TS 抛出 TS2339

Unit test: Mocking service that returns observables to return subjects in order to test change of values over time causes TS to throw TS2339

我有一个服务 returns 由 ngrx 选择器公开的值,以及定义此服务的组件,注入它并根据服务 returned 的值设置属性。

我正在使用服务的模拟为组件编写单元测试,我需要模拟服务为每个单元测试 return 不同的值。 为了做到这一点,我定义了模拟服务 class,因此它 return 是主题而不是可观察对象。测试 运行,但 TS 抛出错误,指出模拟服务的接口与真实服务的接口不匹配,因为真实服务 returns observables。

Stackblitz

stackblitz 工作正常,测试 运行 正确,但如您所见,TS 抛出了错误 TS2339: 属性 'next' 在类型 'Observable'

上不存在

我发现我可以添加 // @ts-忽略 在每次调用 .next() 以告诉 TypeScript 编译器忽略错误的上方,但这似乎不是最佳解决方案。

也许有更好的方法来完全模拟服务,因此它仍然 return 可观察到,但我可以 return 每个单元测试的不同值?

使用 BehaviorSubject 上的 .asObservable() 方法,您可以获得真实服务和模拟 return 相同的东西。您还可以使用必须在 BehaviorSubject 中设置新值的 do() 方法。

为了演示,我整理了这个 StackBlitz。这是来自 StackBlitz 的 MockTestService:

MockTestService {
    private _test$ = new BehaviorSubject(10);
    public test$ = this._test$.asObservable();
    do(param: number): void { this._test$.next(param); }
}  

希望对您有所帮助。