Как проверить «выбрасывание ошибки» в Mocha с помощью асинхронного кода (чтение из БД) с использованием только обратных вызовов (без обещаний, async / await)? - PullRequest
0 голосов
/ 26 мая 2019

Я хочу написать несколько тестов для метода, который читает из файла JSON (имитирует БД) и возвращает правильное имя, если оно существует.

Это код, который я написал для моего метода. Выдает ошибку, когда идентификатор недействителен.

const getOne = (id, callback) => {
    ...
    fs.readFile('db.json', (err, data) => {
      if (err) {
        throw new Error('Error reading file');
      }
      const person = JSON.parse(data)
        .filter(el => el.id === id)
        .map(el => el.name);
      if (person.length === 0) {
        throw new Error('It does not match DB entry');
      }
      callback(person);
    });
    ...

Тест, который я написал:

it('Should reject an invalid id', (done) => {

    api.getOne(100, (person) => {
      try {
        personFromDB = person;
      } catch (error) {

        assert.throws(() => {  
          }, new Error('It does not match DB entry'));
          //done();
      }

Но, похоже, он не прошел тест. Когда я не комментирую «done ()», он проходит тест, но я не думаю, что это потому, что я проходил реальный тест, а скорее потому, что тест попадает в catch и выполняет обратный вызов done ().

Любая помощь, руководство или рекомендация очень ценится.

1 Ответ

0 голосов
/ 26 мая 2019

Вы не сможете поймать Error, брошенный в обратный вызов fs.readFile.

Вместо этого, передавайте любые ошибки обратному вызову, который вы передаете getOne.

Затем вы можете проверить, был ли Error передан вашему обратному вызову в вашем тесте.

Вот рабочий пример, с которого можно начать:

const fs = require('fs');
const assert = require('assert');

const api = {
  getOne: (id, callback) => {
    // ...
    fs.readFile('db.json', (err, data) => {
      if (err) return callback(err);  // <= pass err to your callback
      const person = JSON.parse(data)
        .filter(el => el.id === id)
        .map(el => el.name);
      if (person.length === 0) return callback(new Error('It does not match DB entry'));  // <= pass the Error to your callback
      callback(null, person);  // <= call the callback with person if everything worked
    })
  }
}

it('Should reject an invalid id', done => {
  api.getOne(100, (err, person) => {
    assert.strictEqual(err.message, 'It does not match DB entry');  // Success!
    done();
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...