如何在 Jest 中测试失败时打印请求和响应?

How to print the request and response when a test fails in Jest?

我正在使用 Supertest 和 Jest 来测试 Node.js API。

示例测试具有以下格式

it('Read a note for a user', (done) => {
      request(graphqlURL)
        .post('/graphql')
        .set(baseHeaders())
        .send({
          query: graphQLQuery
        })
        .end((err, res) => {
          expect(res.status).toBe(200);          
          done();
        })

    });

当前,当期望失败时,将记录以下内容

expect(received).toBe(expected) // Object.is equality

    Expected: 200
    Received: 404

我还想记录请求和响应以及失败的测试,以便在调试时获得更多上下文。

有没有办法也打印那些,只针对失败的测试?

您可以像这样打印响应:

it('Read a note for a user', (done) => {
  request(graphqlURL)
    .post('/graphql')
    .set(baseHeaders())
    .send({
      query: graphQLQuery
    })
    .end((err, res) => {
      if(!expect(res.status).toBe(200)) console.log('res',res) // print response
      expect(res.status).toBe(200);          
      done();
    })

  });

expect 通过在期望失败时抛出 Error 来工作。

Errormessage 属性 是打印在测试报告中的内容。

我想如果你想使用一个 现有的 期望并且只是想用额外的数据来增加失败消息,你可以捕获 Error,附加你的额外数据到 message 属性,然后像这样再次抛出 Error

it('Read a note for a user', (done) => {
  request(graphqlURL)
    .post('/graphql')
    .set(baseHeaders())
    .send({
      query: graphQLQuery
    })
    .end((err, res) => {
      try {
        expect(res.status).toBe(200);
      } catch (err) {
        // --- add additional data to the error message here ---
        err.message = `${err.message}\n\nfailing query: ${graphQLQuery}`;
        throw err;  // throw the error so test fails as expected
      }
      done();
    })
});

您可以创建一个 custom matcher 来记录预期失败时的响应:

expect.extend({
  statusCode(expected, response) {
    const { status } = response
    const pass = expected === status

    if (pass) {
      return {
        message: () =>
          `expected ${status} to be ${expected}`,
        pass: true
      }
    } else {
      return {
        message: () =>
          `expected ${status} to be ${expected}. Response: ${response}`,
        pass: false
      }
    }
  }
})

然后在您的测试中,使用自定义匹配器而不是典型的 expect:

it('Read a note for a user', (done) => {
  request(graphqlURL)
    .post('/graphql')
    .set(baseHeaders())
    .send({
      query: graphQLQuery
    })
    .end((err, res) => {
      expect.statusCode(200, res)     
      done()
    })
})

不幸的是,。但是您可以在自定义匹配器的签名中添加关于请求的任意信息。

如果您为正文添加额外的预期,如果它与预期的不匹配,它将被记录下来。在状态码 expect 之前有这个 expect 会产生你想要的效果。