Отсутствует покрытие для улова отрасли - PullRequest
0 голосов
/ 30 октября 2018

Я начинаю создавать API, используя Node.js и Koa. Я использую Mocha / Chai для тестирования, но по какой-то причине ни один из моих блоков try/catch не тестирует блок catch. Например, вот вывод из Coveralls.io:

router.get(BASE_URL, async (ctx) => {
  try {
    const companies = await queries.getAllCompanies();  
    ctx.body = {
      status: 'success',
      data: companies
    };
  } catch (err) {
    ctx.status = 400;     // !
    ctx.body = {          // !
      status: 'error',
      message: err.message || 'Sorry, an error has occurred.'
    };  
  }
}

Ветви [[0, 0], [0, 1]] пропущены.

Я пометил две строки // !, которые упоминаются в коде. Вот соответствующий раздел моего test.js файла, который тестирует API GET:

describe('GET /api/v1/companies', () => {
  const companies = realm.objects('Company');
  it('should return an empty list', (done) => {
    chai.request(server)
    .get('/api/v1/companies')
    .end((err, res) => {
      should.not.exist(err);
      res.status.should.equal(200);
      res.type.should.equal('application/json');
      res.body.status.should.eql('success');
      Object.keys(res.body.data).length.should.eql(0);
      done();
    });
  });
  it('count should be 0', (done) => {
    companies.length.should.eql(0);
    done();
  });
  it('should return 3 newly added companies', (done) => {
    realm.write(() => {
      realm.create('Company', { id: '1', companyName: 'test company 1' });
      realm.create('Company', { id: '2', companyName: 'test company 2' });
      realm.create('Company', { id: '3', companyName: 'test company 3' });
    });

    chai.request(server)
    .get('/api/v1/companies')
    .end((err, res) => {
      should.not.exist(err);
      res.status.should.equal(200);
      res.type.should.equal('application/json');
      res.body.status.should.eql('success');
      Object.keys(res.body.data).length.should.eql(3);
      res.body.data[0].should.include.keys('id', 'companyName', 'notes', 'notesSalt');
      done();
    });
  });
  it('count should be 3', (done) => {
    companies.length.should.eql(3);
    done();
  });
});

Что мне нужно сделать, чтобы добавить покрытие для блока catch? У меня та же проблема с несколькими API, поэтому я определенно хотел бы исправить тесты.

1 Ответ

0 голосов
/ 31 октября 2018

На самом деле оператор "await" - это обертка вокруг "обещания" в блоке try-catch. Из-за этого любые ошибки, которые произошли в разделе «ожидание», фактически произошли в блоке try-catch оболочки. Таким образом, вы не можете поймать эти ошибки, как это.

Но вы можете получить такую ​​ошибку,

await queries.getAllCompanies().catch((err) => { ... })
...