【发布时间】:2022-04-05 02:29:25
【问题描述】:
我正面临一个问题,即某个特定测试的超时超时为 5000 毫秒。以下是我正在测试的方法:
createTask(
newTask: TaskModel,
status: string
): Observable<Model> {
let status: String;
if ('Publish' === publishStatus) {
status = 'Published';
} else {
status = 'Draft';
}
return this.http
.post<void>(
`${this.envTasksApi}/tasks`,
{
...newTask,
currentStatus: status,
},
{
headers: this.headers,
}
)
.pipe(
tap(() => {
this.store.add(task);
}),
switchMap(() => {
return this.publishTaskAction(newTask, publishStatus);
})
);
}
下面是我的测试类代码:
it('should be created', (done) => {
jest.spyOn(store, 'addTask');
taskApiService.createTask(taskToStore[0], 'Publish').subscribe((taskHistoryModel) => {
expect(store.addTask).lastCalledWith(taskToStore[0]);
done();
});
const req = httpTestingController.expectOne(api + '/tasks');
expect(req.request.method).toEqual('POST');
expect(req.request.body).toEqual({
...taskToStore[0],
currentStatus: 'Published',
});
req.flush(taskToStore[0]);
});
如果我从要测试的方法中删除 switchMap 部分,那么测试运行良好。请提出任何解决此问题的方法。谢谢!!
Edit1:按照 Esaith 的建议,我更新了以下代码:
it('should save task in store when new one is created', (done) => {
jest.spyOn(store, 'addTask');
taskApiService.createTask(taskToStore[0], 'Publish').subscribe(() => {
taskApiService.publishActionTask(taskToStore[0], 'Publish').subscribe(() => {
expect(store.addTask).lastCalledWith(taskToStore[0]);
});
const req = httpTestingController.expectOne(api + '/tasks');
expect(req.request.method).toEqual('POST');
expect(req.request.body).toEqual({
...taskToStore[0],
currentStatus: 'Published',
});
req.flush(taskToStore[0]);
done();
});
});
仍然面临同样的问题。
Edit2:我为 publishActionTask 编写了一个单独的测试,并且超时也在发生。下面是代码:
it('should publish the task', (done) => {
jest.spyOn(store, 'addTask');
jest.setTimeout(30000);
taskApiService.publishActionTask(taskToStore[0], 'PublishTask').subscribe(() => {
const req = httpTestingController.expectOne(api + '/tasks/actions');
expect(req.request.method).toEqual('POST');
req.flush(taskToStore[0]);
done();
});
});
虽然这段代码在通过 web 测试时运行良好。请有更多建议。
【问题讨论】:
-
您可以尝试增加测试超时,看看是否有帮助。也许只需要一点
-
我添加了 jest.setTimeout(30000);到 it() 之后的第一行,但仍然是同样的错误。
-
理想情况下,您不会在测试中进行真正的 API 调用。即使您每次测试最多 3 秒但进行了 1000 次测试,在等待测试完成时也只需几分钟喝咖啡。在调用 done() 之前,我希望 req 和最后 2 个期望函数在 subscribe 函数中。
-
@Esaith,我用代码编辑了这个问题。这是你的建议吗?
-
publishTaskAction 有什么作用?这是一个在令人满意的时间内返回的 observable 吗?