【问题标题】:How to test "functions returning errors" using Jest and Typescript?如何使用 Jest 和 Typescript 测试“函数返回错误”?
【发布时间】:2021-03-12 00:54:25
【问题描述】:

如何使用 Jest 测试 fs.writeFile?

我想使用 Jest 测试以下 fs.write 函数

async function saveFile(): Promise<void | Error> {
  fs.writeFile("./test.txt", (await newStockLength()).toString(), (err) => {
    if (err) {
      console.error(err);
      return err;
    }
    //file written successfully
    process.exit(0);
  });
}

我的测试是:

it("should run no mather what", async () => {
      const ran = await saveFile();
      expect(ran).resolves.not.toBe(Error);
    }); 

如果 Node 返回 an Error object,我想在测试中查看错误。

我应该如何在打字稿中将错误对象添加到Promise&lt;void | ErrorObject &gt;

如果我使用Promise&lt;void | Error&gt; 并使用toBeNull

      expect(ran).resolves.toBeNull();

我收到以下错误:

    expect(received).resolves.toBeNull()

    Matcher error: received value must be a promise

    Received has value: undefined

【问题讨论】:

标签: node.js typescript jestjs


【解决方案1】:

fs.writeFile 不返回承诺。如果您可以阻止事件循环,fs.writeFileSync 是一个很好的同步替代方案。

在我看来,您的代码并没有达到您的预期。 saveFile 函数返回一个Promise,回调的结果与返回的Promise 无关,而且您不必等待写函数的工作发生。在同一个函数中使用回调和 Promises 可能有点麻烦,因此 Node 带有一个 util.promisify 助手。

import {promisify} from "util";
const writeFileAsync = promisify(fs.writeFile);
async function saveFile (): Promise<void | Error> {
  try {
    await writeFileAsync(...);
  } catch (err) {
    console.error(err);
    return err;
  }
}

或者,您可以通过返回一个承诺来做同样的事情:

await new Promise((resolve, reject) => {
  fs.writeFile(..., (err) => {
    if (err) resolve(err);
    return resolve(null);
  })
})

不过,一般来说,我建议不要使用返回此类错误的函数。让函数在失败时抛出错误是一种更常见、更安全、更有效的模式。

【讨论】:

  • 你建议不要测试fs.writeFile吗?事实证明,我不明白 fs.writeFileSyncfs.writeFile 之间的区别。 fs.writeFile 不返回承诺。 medium.com/@abdishire15/…
  • 我会测试你的 usage nodejs 提供的模块,但我不会测试 nodejs 模块本身。
  • 有些人建议编写单元测试以充分理解您使用的任何模块。这往往是矫枉过正,但它确实消除了误解(比如这个)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 2019-03-14
  • 2020-10-09
  • 1970-01-01
  • 2022-01-24
  • 2019-07-22
相关资源
最近更新 更多