我想使用 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
答案 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);
})
})
不过,总的来说,我建议不要使用返回此类错误的函数。让函数在失败时抛出错误是一种更为常见、安全且有效的模式。