【问题标题】:Exceeded timeout of 5000 ms for a test when the target method has 2 api calls当目标方法有 2 个 api 调用时,测试超时超过 5000 毫秒
【发布时间】: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 吗?

标签: angularjs jestjs


【解决方案1】:

好吧,错误信息误导了我,在编写测试用例时,期望应该按照从主代码完成的调用顺序完成。所以这对我有用:

it('should save task in store when new one is created', (done) => {
    jest.spyOn(store, 'addSomething1');
    taskApiService.createTask(taskToStore[0], 'action1').subscribe(() => {
      expect(store.addTask).lastCalledWith(taskToStore[0]);
      done();
    });

    const req = httpTestingController.expectOne('mock-task-path' + '/tasks');
    expect(req.request.method).toEqual('POST');
    req.flush(null);
    const publishReq = httpTestingController.expectOne(
      'mock-task-path' + '/tasks/actions'
    );
    expect(publishReq.request.method).toEqual('POST');
    publishReq.flush(null);
    const getHistoryReq = httpTestingController.expectOne(
      'mock-task-path' + '/tasks/Finance/test1/history'
    );
    expect(getHistoryReq.request.method).toEqual('GET');
    getHistoryReq.flush({
      taskId: '1',
      taskStatuses: [
        {
          id: null,
          date: null,
          status: 'Action1',
          changes: '',
        },
      ],
    });
  });

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 2020-05-13
    • 2019-03-11
    • 2019-04-23
    • 1970-01-01
    • 2018-11-13
    • 2020-08-24
    相关资源
    最近更新 更多