Как распечатать запрос и ответ при сбое теста в Jest? - PullRequest
1 голос
/ 11 марта 2019

Я использую 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

Я также хотел бы зарегистрировать запрос и ответ вместе с ошибочными тестами, чтобы иметь больше контекста при отладке.

Есть ли способ распечатать их также только для тех тестов, которые не пройдены?

Ответы [ 3 ]

1 голос
/ 11 марта 2019

expect работает, бросая Error, когда ожидание не выполняется.

Свойство message Error - это то, что печатается в отчете об испытаниях.

Полагаю, если вы хотите использовать существующее ожидание и просто хотите дополнить сообщение об ошибке дополнительными данными, которые вы можете перехватить 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();
    })
});
0 голосов
/ 11 марта 2019

Вы можете создать настраиваемое сопоставление , которое регистрирует ответ при сбое ожидания:

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

К сожалению, на самом деле нет способа получить доступ к HTTP-запросу, используя супер-тест .Но вы можете добавить любую произвольную информацию о запросе, которая у вас есть, к подписи вашего пользовательского сопоставителя.

0 голосов
/ 11 марта 2019

Вы можете напечатать ответ следующим образом:

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

  });
...