如何在 angular 8 中编写 rxjs 间隔的测试用例?
How to write test case for rxjs interval in angular 8?
我有一个方法“intervalCall()”到 app.component.ts 并使用 rxjs 间隔每 60 秒发送一次请求,所以想为 spect 文件测试它的用例,下面是方法。
intervalCall() {
interval(60 * 1000)
.pipe(mergeMap(() => this.XYZService.XYZmethod()))
.subscribe((data: StatusDependents) => {
if (data.status === 'UP') {
location.reload();
}
});
}
this.XYZService.XYZmethod() 是我每 60 秒发送一次的服务呼叫。
我已经写下下面的测试用例,仍然出现错误,1 个周期性计时器仍在队列中。
describe('#intervalCall', () => {
it('should call intervalCall method when status is UP', fakeAsync(() => {
const statusData: StatusDependents = { status: 'UP' };
const statusSpy = jest.spyOn(userService, 'statusDependents').mockReturnValue(of(statusData));
component.intervalCall();
fixture.detectChanges();
tick(180500);
expect(statusSpy).toHaveBeenCalled();
flush();
}));
});
使用假异步。在这里查看它的使用方式:https://v8.angular.io/guide/testing
我发现的主要优点是您在单元测试时不会等待真正的秒数,您可以使用 tick(180500)
立即向前跳转 3 分 1/2 秒。
我有一个方法“intervalCall()”到 app.component.ts 并使用 rxjs 间隔每 60 秒发送一次请求,所以想为 spect 文件测试它的用例,下面是方法。
intervalCall() {
interval(60 * 1000)
.pipe(mergeMap(() => this.XYZService.XYZmethod()))
.subscribe((data: StatusDependents) => {
if (data.status === 'UP') {
location.reload();
}
});
}
this.XYZService.XYZmethod() 是我每 60 秒发送一次的服务呼叫。
我已经写下下面的测试用例,仍然出现错误,1 个周期性计时器仍在队列中。
describe('#intervalCall', () => {
it('should call intervalCall method when status is UP', fakeAsync(() => {
const statusData: StatusDependents = { status: 'UP' };
const statusSpy = jest.spyOn(userService, 'statusDependents').mockReturnValue(of(statusData));
component.intervalCall();
fixture.detectChanges();
tick(180500);
expect(statusSpy).toHaveBeenCalled();
flush();
}));
});
使用假异步。在这里查看它的使用方式:https://v8.angular.io/guide/testing
我发现的主要优点是您在单元测试时不会等待真正的秒数,您可以使用 tick(180500)
立即向前跳转 3 分 1/2 秒。