如何使用 Jest 和 Typescript 测试“返回错误的函数”?

时间:2021-03-10 14:47:20

标签: node.js typescript jestjs

如何使用 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<void | ErrorObject > 添加错误对象?

如果我使用 Promise<void | Error> 并使用 toBeNull

      expect(ran).resolves.toBeNull();

我收到以下错误:

    expect(received).resolves.toBeNull()

    Matcher error: received value must be a promise

    Received has value: undefined

1 个答案:

答案 0 :(得分:0)

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

在我看来,您的代码并没有像您期望的那样做。 saveFile 函数返回一个 Promise,回调的结果与返回的 Promise 无关,并且您不是在等待写入函数的工作发生。在同一个函数中使用回调和 Promise 可能有点麻烦,所以 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;
  }
}

或者,你可以通过返回一个 promise 来做同样的事情:

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

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

相关问题