Как протестировать асинхронные вызовы, чтобы Стамбул покрыл их?

Я тестирую модульное тестирование моего API. После того, как я написал все тесты, я реализовал инструмент покрытия istanbul. Он покрыл все без проблем, кроме ответвлений. Посмотрев отчет, я увидел, что асинхронные вызовы не тестировались, но на самом деле они выполнялись не менее 5 раз. В данном случае async запускался 15 раз.

Небольшой пример моего теста:

describe('GET /tables', () => {
  it('should GET tables', (done) => {
    chai.request(server)
      .get('/api/v1/tables')
      .then((res) => {
        expect(res).to.have.status(200);
        expect(res.body).to.be.a('array');
        done();
      })
      .catch((err) => {
        done(err)
      })
  });
})

Часть отчета о покрытии для этого теста:

export default async (req, res) => {
  let tables = [];
  try {
    tables = await Tables.findAndCountAll({
      where: {
        ...req.filter,
        material: null
      },
      // order: sort ? sort : [],
      limit: req.pagination.limit, 
      offset: req.pagination.offset
    });
  } catch (err) {
    console.log(err);
    return res.status(500).send({ error: 'Internal server error' });
  }

Строка 1: отмечает async (r и говорит, что ветвь не покрыта


person Zeeecho    schedule 11.04.2019    source источник


Ответы (1)


Починил это. Насколько я понимаю эту проблему, когда nyc получает покрытие для переданного кода, он не может сопоставить его с исходным кодом, поэтому, когда это происходит, nyc прекращает покрытие. Плагин babel-plugin-istanbul исправил это. Он поддерживает код ES2015+, поэтому он обратно совместим с использованием Babel. Я следовал этому простому руководству.

person Zeeecho    schedule 17.04.2019