unit-testing - 如何在服务器端模拟客户端 nextJs 动态导入?
问题描述
这是对之前提出的一些问题的微妙变化。我们正在使用 jest 来运行一些 ssr 测试:
module.exports = {
testEnvironment: 'node', // NOT jsdom
}
我们的 Next.JS 组件混合了客户端动态导入和服务器端动态导入。
// server-side dynamic import
const Content = dynamic(() => import('../shared/Content'));
// client-side dynamic import
const LoginDialog = dynamic(() => import('../dialogs/LoginDialog'), {
ssr: false,
});
关键是,在运行 ssr 测试时,因为它是在服务器端运行的,所以我们的快照应该包含来自服务器端动态导入的内容,而不应该包含来自客户端动态导入的内容。
但不幸的是,我们搁浅了,因为我们遇到了以下情况之一:
使用时
testEnvironment: 'node'
,jest-next-dynamic
抱怨preloadAll
无法在客户端动态导入上调用(虽然它在服务器端动态导入上工作正常)如果我们删除
jest-next-dynamic
并调用 preloadAll,那么服务器端动态导入的内容不再在我们的快照中如果我们回到
testEnvironemnt: 'jsdom'
,那么即使我们window
在服务器端引用或其他特定于浏览器的东西,我们的 ssr 测试也会通过,这非常糟糕
所以,问题是:我们如何使用 jest 和 Next.JS 来正确模拟客户端动态导入,同时继续实现服务器端动态导入?
我们还研究了如何next/dynamic
使用 jest 来模拟/间谍,以便仅模拟 if ssr: true
,但看起来 jest 不支持根据参数值进行模拟。
解决方案
推荐阅读
- javascript - 我可以在 Javascript 中使这段代码更清晰吗?
- ruby-on-rails - 在现有 rails 项目上安装 `cssbundling-rails` 后引用现有的 scss 资产
- sql - 如何查找日期范围内的出现次数?
- flutter - VS 代码无法连接到 Chrome 调试端口:37095
- dolphindb - dolphindb 是否支持加权最小二乘回归“wls”?
- sql - 如何在每一列中聚合和分组?
- javascript - React 表单正在将文本字段值放入查询字符串中?
- php - 使用可选键按多个键对数组进行排序
- authentication - 支持人员重置密码后暂时禁用 FreeIPA 中的最短密码时间
- python - 如何使用 settings.py 从 Django 中的 CKeditor 4 中删除按钮