模拟Angular 4测试中的可观察时间段

时间:2017-06-16 13:24:34

标签: angular unit-testing jasmine rxjs5

我正在尝试为使用可观察数据服务的组件编写单元测试。我的数据服务有问题,它会进行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。

0 个答案:

没有答案