我想为从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()回调。>
非常感谢您的帮助,指导或建议。
答案 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();
});
});