笑话:等待异步测试完成后再运行下一个测试

Posted

技术标签:

【中文标题】笑话:等待异步测试完成后再运行下一个测试【英文标题】:Jest: Wait for an async test to finish before running the next one 【发布时间】:2018-12-19 13:45:18 【问题描述】:

假设我有这些测试用例(jestsupertest):

describe('Test actors', async () => 
  const params =  /* ... */ 
  let actorId

  test(`Create an actor $actorsUrl`, async () => 
    const response = await request(app.callback())
      .post(actorsUrl)
      .send(params)
      .set('Accept', 'application/json')
      .set('Content-Type', 'application/json')
      .expect(200)
    expect(response.body.name).toBe(params.name)
    expect(response.body.address).toBe(params.address)
    actorId = response.body.id
  )

  test(`Get the actor created $actorsUrl/$actorsUrl`, async () => 
    const response = await request(app.callback())
      .get(`$actorsUrl/$actorsUrl`)
      .set('Accept', 'application/json')
      .expect(200)
    expect(response.body.name).toBe(params.name)
    expect(response.body.address).toBe(params.address)
  )
)

我想在运行第二个测试之前等待第一个测试完成(因为第一个测试创建一个Actor,第二个测试向 API 询问创建的Actor)。运行此代码失败,因为尚未创建演员。

有没有办法在调用第二个测试之前等待第一个测试完成?

【问题讨论】:

【参考方案1】:

jestjs 只是jasmine 的包装,在许多情况下它依赖于jasmine 的规则。

因此,您可以使用传递给test 函数的the same done callback:

test(`Create an actor $actorsUrl`, async (done) => 
    const response = await request(app.callback())
      .post(actorsUrl)
      .send(params)
      .set('Accept', 'application/json')
      .set('Content-Type', 'application/json')
      .expect(200)
    expect(response.body.name).toBe(params.name)
    expect(response.body.address).toBe(params.address)
    actorId = response.body.id
    done();
)
test(`Get the actor created $actorsUrl/$actorsUrl`, async (done) => 
    const response = await request(app.callback())
      .get(`$actorsUrl/$actorsUrl`)
      .set('Accept', 'application/json')
      .expect(200)
    expect(response.body.name).toBe(params.name)
    expect(response.body.address).toBe(params.address)
    done();
)

您可以在 jest 的 async documentation 中阅读更多相关信息

【讨论】:

以上是关于笑话:等待异步测试完成后再运行下一个测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在异步笑话 test.each 案例中传入 done() 参数

让笑话/酶测试等待上下文

巨坑:浏览器在短时间内对于同一个请求的处理,会先等待上一个请求完成后,再处理下一个请求,导致在测试异步时误导代码有问题。

线程和异步的分别与联系

等待异步完成后再返回

如何使赛普拉斯等待具有多个结果的异步搜索完成而不会导致测试失败