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

时间:2019-01-15 01:45:53

标签: angular typescript unit-testing observable behaviorsubject

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

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

Stackblitz

stackblitz可以工作并且测试可以正确运行,但是正如您所看到的,TS会引发错误 TS2339:类型“可观察”上不存在属性“下一个”

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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); }
}  

我希望这会有所帮助。