Angular 模拟角度4测试中可观察到的时间过程

Angular 模拟角度4测试中可观察到的时间过程,angular,unit-testing,jasmine,rxjs5,Angular,Unit Testing,Jasmine,Rxjs5,我正在尝试为使用可观察数据服务的组件编写单元测试。我对数据服务有一个问题,它进行HTTP调用,并且可以延迟返回数据 我模仿服务返回一个可观察到的主题。然后,在“it”块中,我将需要的东西(错误、正确的数据等)推下该流。然而,在这种情况下,我无法模拟时间的流逝——应用程序永远不会处于加载状态,因为数据服务会立即响应。所以我在模拟中添加了延迟操作符。但是,使用delay操作符使用tick()提前时间似乎无法正常工作 我以另一种方式尝试了它:对于模拟,我使用TestScheduler。然后我使用flu

我正在尝试为使用可观察数据服务的组件编写单元测试。我对数据服务有一个问题,它进行HTTP调用,并且可以延迟返回数据

我模仿服务返回一个可观察到的主题。然后,在“it”块中,我将需要的东西(错误、正确的数据等)推下该流。然而,在这种情况下,我无法模拟时间的流逝——应用程序永远不会处于加载状态,因为数据服务会立即响应。所以我在模拟中添加了延迟操作符。但是,使用delay操作符使用tick()提前时间似乎无法正常工作

我以另一种方式尝试了它:对于模拟,我使用TestScheduler。然后我使用flush()提前时间。然而,flush的问题是它将时间提前到流的末尾(我不能一步一步地做)。我也不能根据每个测试来更改发射值,因为可观测值是硬编码的。如果我想要一个不同的可观察对象,我需要使用不同的模拟提供者再次配置测试床

是否有人以这种方式成功地测试了可观察物

编辑:

我想实现这样的目标:

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()任何值。在第二个例子中,当我使用subject时,我不能以任何方式刷新()或处理时间(排放会立即发生)

我正在寻找一种同时具备以下两种功能的方法: 1.我可以在每次测试的基础上更改发出的内容。 2.我可以模拟时间的流逝。
无需使用不同的提供程序再次配置测试床。

您能展示一些您试图实现的代码吗?我不明白TestScheduler有什么问题。