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

问题描述 投票:3回答:1

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

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

Stackblitz

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

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

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

angular typescript unit-testing observable behaviorsubject
1个回答
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); }
}  

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.