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

时间:2019-03-11 05:53:54

标签: node.js jestjs supertest

我正在使用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

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

是否还有一种方法可以打印那些仅适用于失败的测试?

4 个答案:

答案 0 :(得分:1)

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

message的{​​{1}}属性是打印在测试报告中的内容。

我想如果您想使用现有的 期望,并且只想使用其他数据来扩充失败消息,则可以捕获Error,将您的其他数据附加到{{1 }}属性,然后再次像这样抛出Error

message

答案 1 :(得分:0)

您可以这样打印响应:

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();
    })

  });

答案 2 :(得分:0)

您可以创建一个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()
    })
})

很遗憾,there isn't really a way to access the HTTP request using supertest。但是,您可以将有关请求的任意信息添加到自定义匹配器的签名中。

答案 3 :(得分:0)

如果为正文添加其他期望,则与期望的期望值不匹配的情况将被记录。在状态码期望值之前具有此期望值将导致您所期望的效果。