我正在尝试为使用可观察数据服务的组件编写单元测试。我的数据服务有问题,它会进行HTTP调用,并且可以延迟返回数据。
我嘲笑该服务以返回一个主题的可观察者。然后在'it'块中我按下那个流推送我需要的东西(错误,正确的数据等)。然而,在这种情况下,我无法模拟时间的流逝 - 应用程序永远不会处于加载状态,因为数据服务立即响应。所以我在模拟中添加了延迟运算符。但是,使用tick()推进时间似乎与延迟运算符无法正常工作。
我以其他方式尝试过:对于模拟我使用了TestScheduler。然后我使用flush()提前时间。但是,flush的问题在于它将时间推进到流的末尾(我无法一步一步地完成)。我也不能通过每个测试来改变发射值,因为可观察的是硬编码的。如果我想要一个不同的observable,我需要再次使用不同的模拟提供程序配置TestBed。
有没有人以这种方式成功测试可观测量?
编辑:
我想实现这样的目标:
1. I create service mock and inject it as a provider for my component.
2a. I make the mock service return a ColdObservable using TestScheduler.
e.g. stream = TestScheduler.createColdObservable('-a', {a: myData})
it('should show loading status, () => {
expect(component.loading).toBe(true);
flush();
expect(component.loading).toBe(false);
});
2b. I make the mock service return a subject. Then I next the values I need
for tests.
it('should handle errors, () => {
stream.next(error);
expect(component.errors.length).toBe(1);
});
在第一个例子中,当我使用TestScheduler时,我不能使用next()任何值。在第二个例子中,当我使用主题时,我无法以任何方式执行flush()或处理时间(排放立即发生)。
我正在寻找兼顾两者的方法: 我可以改变每次测试的发射量。 我可以模拟时间的流逝。 无需再次使用不同的提供程序配置TestBed。