Javascript 使用RxJs进行角度单元测试:在可观测响应中引入延迟
我试图对一个函数X进行单元测试。X调用另一个函数Y,它返回一个可观察的值。X给Y打了几次电话。X中的代码使用forkJoin来确保首先完成从Y返回的所有可观察项。所以我也必须测试这一部分。我嘲笑对Y的呼吁是:Javascript 使用RxJs进行角度单元测试:在可观测响应中引入延迟,javascript,angular,unit-testing,rxjs,Javascript,Angular,Unit Testing,Rxjs,我试图对一个函数X进行单元测试。X调用另一个函数Y,它返回一个可观察的值。X给Y打了几次电话。X中的代码使用forkJoin来确保首先完成从Y返回的所有可观察项。所以我也必须测试这一部分。我嘲笑对Y的呼吁是: spyOn(anotherService, "Y").and.returnValues(of(data1), of(data2)); 为了让事情变得更现实一点,我想在Y的响应中引入一个延迟,这样在完成第一个可观察到的和第二个可观察到的之间就有明显的时间间隔,这样X中的
spyOn(anotherService, "Y").and.returnValues(of(data1), of(data2));
为了让事情变得更现实一点,我想在Y的响应中引入一个延迟,这样在完成第一个可观察到的和第二个可观察到的之间就有明显的时间间隔,这样X中的forkJoin代码就可以得到正确的测试
如何在此处引入延迟?您可以尝试使用
delay
操作符,但我建议不要这样做。您不应该测试forkJoin
,它已经被RxJS的创建者测试过了
但是,如果您真的想要,请尝试这样做:
import { delay } from 'rxs/operators';
.....
spyOn(anotherService, "Y").and.returnValues(of(data1), of(data2).pipe(delay(50)); // add a delay of 50ms like so
通常,添加
延迟
(或RxJs时间函数)会使测试变得很困难,因为您可能会遇到一个周期性任务仍在队列中
或其他错误。如果您不想等待整个50ms
,fakeAsync
的话,您可能需要利用fakeAsync
和tick
,我不是在测试forkJoin。我想测试代码的某些部分是在完成所有的观察之后执行的。