为什么我无法捕获这些错误?

时间:2020-08-30 11:29:32

标签: node.js async-await jestjs

我正在为一个库编写一个测试套件,并试图在其他地方重复使用我在字面上使用的模式,以便测试它应该抛出的错误。例如,在另一个测试套件中,我有以下代码(效果很好):

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引发)?

1 个答案:

答案 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