我正在为一个库编写一个测试套件,并试图在其他地方重复使用我在字面上使用的模式,以便测试它应该抛出的错误。例如,在另一个测试套件中,我有以下代码(效果很好):
const fun = rawFileDownloaderFactory(fetch)(noop);
await expect(() => fun(t)).rejects.toThrow(new NoDirectoryAccessError(badDir));
我现在正在测试以查看我的函数在无法写入文件时是否抛出该异常(这是库的另一部分),但是某种程度上该错误被抛出了外部处理逻辑。为了深入了解这一点,我编写了以下工具:
const fun = datafileWriterFactory(fetch)(selector, parser)(noop);
try {
console.log("START");
await (
fun(t)
.then(() => console.log("WORKED"))
.catch((e) => console.error("FAILED", e))
);
} catch(e) {
console.error("This should have been caught before", e);
} finally {
console.log("FINISH");
}
await expect(() => fun(t)).rejects.toThrow();
我使用jest
作为测试运行程序,运行此测试时,我得到以下输出:
● Console
console.log
START
at Object.<anonymous> (lib/sinks/datafile_writer_factory.test.ts:256:15)
● datafileWriterFactory creates a Sink which › throws when it cannot write to the file
ENOENT: no such file or directory, open '/tmp/knobble-test-FHlzW9-not/addresses.json'
但是,我希望至少有一种错误处理方法可以起作用(尝试... catch或Promise.catch)。
为什么在玩笑中无法正确捕获这些错误(由fs.createWriteStream
引发)?
答案 0 :(得分:1)
我认为您的代码不会执行catch块,也不会执行catch
回调,因为fs.createWriteStream
方法返回的是WritableStream
而不是解析为{的Promise
{1}}。
这意味着您需要监听WritableStream
事件,而不是尝试处理Promise拒绝或捕获错误。
我已经在控制台中尝试过此操作以确认:
error
例如,假设我无法写const fs = require("fs");
let writeStream;
try {
writeStream = fs.createWriteStream("/test.txt");
} catch (e) {
console.log("not logged", e);
}
writeStream.on("error", (e) => console.log("logged", e));
,我得到:
/test.txt