在 PDF.js 2.0.385 及更高版本上,运行以下最简单的示例:
pdf.getDocument({ data: arrayBufferData })
.then(() => console.log('Success'))
.catch() => console.log('Fail'));
显然,在 Node.js 上运行良好。
在 Jest 中运行相同的部分,如本例所示(简化,请忽略测试应该是异步的事实):
describe('Test', () => {
it('does something', () => {
pdf.getDocument({ data: arrayBufferData })
.then(() => console.log('Success'))
.catch() => console.log('Fail'));
});
}
testEnvironment
设置为"node"
,则成功。testEnvironment
设置为"jsdom"
(默认),则挂起并且永远不会达到.then()
。在 PDF.js 2.0.305 和更早版本上,这不是问题,因为您可以轻松地手动禁用工作器。
既然从 #9385 开始无法通过 config 执行此操作,所有使用 PDF.js 和 Jest/JSDom 的项目都将无法测试任何与 PDF.js 相关的内容。 将testEnvironment
切换到"node"
通常不是一个选项,因为这将导致前端的几乎所有其他内容都失败。
如ISSUE_TEMPLATE.md和CONTRIBUTING.md中所述:
对于自定义实现的问题,您需要提供对完整的、小型的、可运行的示例的访问权限,以使问题具有可操作性。 并且请不要假设人们熟悉各种 JS 框架,在本例中是“Jest”。
没有任何上下文或代码,我会想到以下问题:
是否支持工人,如果支持,您是否尝试设置workerSrc
选项并仅在启用工人的情况下运行测试?
您是否尝试过使用workerPort
选项来加载工作文件? 请记住,也可以将工作人员传递给getDocument
,请参阅https://github.com/mozilla/pdf.js/blob/0d391daccc2f4e4b9c91268e719bd10fe63a49ae/src/display/api.js#L129 -L130
我已经成功应对了! 对于像我这样卡住的人,不要设置pdfjs.GlobalWorkerOptions.workerSrc
或pdfjs.GlobalWorkerOptions.workerPort
。 相反,使用 pdf.worker.entry.js 文件 - 只需导入它就可以了!
上面的解决方案对我不起作用,而是我不得不将 jest 配置为使用 node 而不是 jsdom (默认启用)
将此添加到我的规范文件的顶部解决了它
/**
* @jest-environment node
*/
对我来说,上述解决方案都不起作用。 我在玩笑测试中使用 vue-cli
最有用的评论
我已经成功应对了! 对于像我这样卡住的人,不要设置
pdfjs.GlobalWorkerOptions.workerSrc
或pdfjs.GlobalWorkerOptions.workerPort
。 相反,使用 pdf.worker.entry.js 文件 - 只需导入它就可以了!