javascript - 如何在 Jest 中比较 ENOENT 错误?
我有以下函数:
export const readAsync = (filename: string): Promise<object> =>
new Promise((resolve: (data: object) => void, reject: (data: Error) => void) => {
readFile(join(__dirname, `../../__mocks__/${filename}`), 'utf8', (err: Error, data: string) => {
if (err) {
reject(err);
} else {
resolve(JSON.parse(data));
}
});
});
我已经用 TypeScript 编写了它,并且我正在通过 ts-jest 测试它:
describe('Testing readAsync function', () =>
test('filename \"undefined\".', () => {
const filePath: string = join(__dirname, '../../__mocks__/undefined');
const errorMessage: Error = new Error(`ENOENT: no such file or directory, open \'${filePath}\'`);
expect.assertions(1);
return expect(readAsync(undefined)).rejects.toMatchObject(errorMessage);
});
但是这给了我这个错误:
expect(received).toMatchObject(expected)
Expected value to match object:
[Error: ENOENT: no such file or directory, open '/home/farm/Documents/podsearch_bot/__mocks__/undefined']
Received:
[Error: ENOENT: no such file or directory, open '/home/farm/Documents/podsearch_bot/__mocks__/undefined']
Difference:
Compared values have no visual difference.
我真诚地认为,这必须是一个匹配器选项,但现在我测试的是:
- 匹配对象
- 成为
- 等于
- 是某个实例
- toThrow —— 即使明知什么也不抛出
- 包含对象
- 匹配
但似乎没有一个有效……我该怎么解决这个问题?
答案#1
一种使其工作的方式是捕获错误并比较它返回的代码,使用你的例子:
test('Should return an error', async () => {
try {
await readAsync('./nomatch/nomatch.txt');
} catch (e) {
expect(e.code).toEqual('ENOENT');
}
});
JavaScript 属性可能是不可枚举的,这意味着它们不会出现在 for..in 循环或 Object.keys 的结果中。
你可能想知道可以使用 Object.getOwnPropertyNames(e) 获取 Error 对象上的哪些键
答案#2
test('Should return an error', async () => {
expect(async() => await readAsync('./nomatch/nomatch.txt')).toThrow('ENOENT: no such file or directory, open \'./nomatch/nomatch.txt\'');
expect(async() => await readAsync('./nomatch/nomatch.txt')).toThrow(/^ENOENT.*/g);
});
当你将一个箭头函数作为参数传递给 expect 时,jest 会执行该函数。
