【问题标题】:Testing file read wtih fs using JEST使用 JEST 测试使用 fs 读取的文件
【发布时间】:2020-06-16 21:36:06
【问题描述】:

我正在尝试测试以下功能:

async function read () {
  return new Promise(function(resolve, reject) {
    fs.readFile("INVALID_PATH", (err, contents) => {
      if (err) {
        reject(new Error('ERROR'));
      }
      resolve(contents);
    });
  });
}

通过测试:

try {
  await read();
} catch (e) {
  expect(e).toMatch('ERROR');
}

但是,我无法在 catch 时捕捉到拒绝,它让我超时。

有什么建议吗?

编辑:

我设法通过使用模拟使其工作,这样:

try {
  fs.readFile.mockReset()
  fs.readFile.mockImplementation((path, options, cb) => {
    cb('ERROR')
  })

  await readFile()

} catch (err) {
  expect(err).toBe('ERROR')
}

但是,我仍然不明白为什么这是必要的......

【问题讨论】:

  • 新错误返回一个对象
  • 是的,但无论返回什么新错误,我都应该在 catch 时捕获任何拒绝返回,在这种情况下我不能。

标签: javascript promise async-await jestjs fs


【解决方案1】:

您是否尝试过在 Jest 中将测试函数声明为 asyncawait 不能在异步函数之外(或顶级代码)使用,你必须这样做:

it('works with async/await', async () => {
  expect.assertions(1);
  const data = await user.getUserName(4);
  expect(data).toEqual('Mark');
});

// async/await can also be used with `.resolves`.
it('works with async/await and resolves', async () => {
  expect.assertions(1);
  await expect(user.getUserName(5)).resolves.toEqual('Paul');
});

更多关于测试 async/await 的信息 https://jestjs.io/docs/en/tutorial-async.html

【讨论】:

  • 我认为问题出在“fs”库中。我设法通过使用 mockImplementation 方法使用 fs readFile 函数的模拟来使其工作。
  • 有趣,我会尝试做更多的实验并找出它为什么会超时。
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2020-11-21
  • 2016-11-27
  • 2020-09-21
  • 2021-09-05
相关资源
最近更新 更多