如何在Mocha中仅使用回调(无承诺,异步/等待)以异步代码(从db读取)在Mocha中测试“引发错误”?

时间:2019-05-25 23:18:23

标签: javascript node.js mocha

我想为从JSON文件读取(模拟db)并返回正确名称(如果存在)的方法编写一些测试。

这是我为我的方法编写的代码。当ID无效时,确实会引发错误。

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()'时,它通过了测试,但是我不认为这是因为我通过了实际测试,而是因为测试进入了陷阱并执行了done()回调。

非常感谢您的帮助,指导或建议。

1 个答案:

答案 0 :(得分:0)

您将无法捕获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();
  });
});