单元测试:为了测试值随时间的变化而返回可观察数据以返回主题的模拟服务导致TS抛出TS2339

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单元测试:为了测试值随时间的变化而返回可观察数据以返回主题的模拟服务导致TS抛出TS2339相关的知识,希望对你有一定的参考价值。

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

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

Stackblitz

stackblitz工作正常并且测试运行正常,但正如您所看到的,TS会抛出错误TS2339:类型'Observable'上不存在属性'next'

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

也许有更好的方法来完全模拟服务,所以它仍然返回可观察量,但我可以为每个单元测试返回不同的值?

答案

您可以使用BehaviorSubject上的.asObservable()方法获得真实服务和模拟返回相同的内容。您还可以使用do()方法在BehaviorSubject中设置新值。

为了证明,我把这个StackBlitz放在一起。这是StackBlitz的MockTestService:

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

我希望这有帮助。

以上是关于单元测试:为了测试值随时间的变化而返回可观察数据以返回主题的模拟服务导致TS抛出TS2339的主要内容,如果未能解决你的问题,请参考以下文章

对有延迟的 Rxjava 可观察对象进行单元测试

ngFor正在根据可观察变量的变化重新渲染内容

测试可观察对象 Angular 2 业力

如何获取嵌套道具函数的值以进行单元测试

如何对服务中的 BehaviorSubject 变量进行单元测试,它是组件中的可观察对象

颤振从单元\小部件测试调用http请求而不进行模拟