网站搜索

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 会执行该函数。