umi icon indicating copy to clipboard operation
umi copied to clipboard

[Bug] @umijs/max": "4.0.43 自定义测试用例执行问题,定位到4.0.43版本代码更改导致

Open liangskyli opened this issue 1 year ago • 18 comments

What happens?

  • "@umijs/max": "4.0.42", 测试用例正常
  • "@umijs/max": "4.0.43", 测试用例不正常,提示Invariant violation: "Buffer.from("") instanceof Uint8Array" is incorrectly false

Mini Showcase Repository(REQUIRED)

Please provide a minimal reproduction then upload to your GitHub. 请提供 最小重现,并上传到你的 GitHub 仓库 复现仓库:https://github.com/liangskyli/umi4-bug/tree/umi4-jest-bug

How To Reproduce

  • 步骤:

    • yarn
    • yarn test test/common.test.tsx
  • 说明

    • "@umijs/max": "4.0.42", 测试用例正常
    • "@umijs/max": "4.0.43", 测试用例不正常,提示Invariant violation: "Buffer.from("") instanceof Uint8Array" is incorrectly false
  • 结果 image

  • 定位:

    • 定位到4.0.43版本代码更改导致,测试用例执行失败,导致不能升级
    • const originalModule = jest.requireActual('umi'); 对umi 做mock逻辑很常见,希望有空排帮忙查下问题,4.0.43版本提交记录导致的

Steps to reproduce the behavior: 1. 2.

Expected behavior 1. 2.

Context

  • Umi Version:>=4.0.43
  • Node Version:14.18.0
  • Platform: windows 10

liangskyli avatar Feb 03 '23 09:02 liangskyli

max 项目没有显示的 umi 依赖,要从 @umijs/max 导入方法,mock @umijs/max

fz6m avatar Feb 03 '23 10:02 fz6m

使用@umijs/max也一样有问题,试过了

liangskyli avatar Feb 03 '23 10:02 liangskyli

demo 改成@umijs/max了,也是4.0.43版本开始有问题,mac机器也有问题,4.0.42版本没问题

liangskyli avatar Feb 03 '23 11:02 liangskyli

我使用最新 4.0.49 版本,umi 全部改成 @umijs/max 是可以的,如果还有问题,需要给一个最小复现。

fz6m avatar Feb 03 '23 11:02 fz6m

Uploading image.png… 4.0.49安装不了,提示:error An unexpected error occurred: "https://registry.npmmirror.com/@umijs/utils/-/utils-4.0.49.tgz: Request failed "404 Not Found"". 4.0.48版本不可以,复现仓库:https://github.com/liangskyli/umi4-bug/tree/umi4-jest-bug

liangskyli avatar Feb 03 '23 11:02 liangskyli

https://registry.npmmirror.com/@umijs/utils/-/utils-4.0.48.tgz 可以下载 https://registry.npmmirror.com/@umijs/utils/-/utils-4.0.49.tgz 不能下载,4.0.49版本不能验证

liangskyli avatar Feb 03 '23 11:02 liangskyli

4.0.49版本也不可以,复现仓库:https://github.com/liangskyli/umi4-bug/tree/umi4-jest-bug --使用http://registry.npmjs.org/ 安装4.0.49版本 image

liangskyli avatar Feb 03 '23 12:02 liangskyli

看一下这个:https://github.com/umijs/umi/issues/9422

目前不支持 mock umi ,需要使用页面级测试方案,可以参考 https://github.com/ant-design/ant-design-pro/blob/master/src/pages/User/Login/login.test.tsx 。

fz6m avatar Feb 03 '23 12:02 fz6m

我没有使用@umijs/max 内置的test库(没有使用umi/test),应该不是同一个问题,那个bug是22年9月23号的,4.0.42在那个bug之后的版本都没有问题,4.0.43开始有问题的

liangskyli avatar Feb 03 '23 12:02 liangskyli

image 在4.0.42到4.0.43之间,使用4.0.0-canary.20230109.1版本没问题,到4.0.43版本有问题,看代码没看出哪个提交引起的,大佬有空帮忙排查下,谢谢

liangskyli avatar Feb 06 '23 02:02 liangskyli

可能是升级依赖导致的,参考 https://github.com/evanw/esbuild/issues/2862 这个 issue ,某个依赖不支持这样做了或者出问题了。

fz6m avatar Feb 06 '23 05:02 fz6m

image 确实是这个,"esbuild": "0.15.18",强制这个版本,就可以了

liangskyli avatar Feb 06 '23 07:02 liangskyli

这种 require('umi') 的格式其实是把 umi 的 nodejs 运行时导进去了,而在项目里,有 umi 的 alias 到 client 运行时,并不是 nodejs 的运行时。

所以此处不应该把代码转为 cjs 再运行,会错误混入 nodejs 的 umi 运行时,最好用 vite 这种 esm 优先的组件测试方案,独立测试你的组件。

fz6m avatar Feb 06 '23 08:02 fz6m

目前@umijs/max/test 支持vite模式了吗?支持的话,后期我再抽时间迁移,还是需要自己搭建vite esm 优先的组件测试方案?

liangskyli avatar Feb 07 '23 02:02 liangskyli

你自己编写的组件都是 esm 语法的,把某一部分抽出来用 esm 测试可以的。

参考这个 examples/test-vitest ,如果要用 jest 可以去 vitest examples/react-testing-lib 这里参考用法。

fz6m avatar Feb 07 '23 07:02 fz6m

这个问题的最终结论应该是探索 vitest 的 e2e 测试可能性,jest 不是一个 esm 友好的测试工具,所以测试 esm 的组件需要 tramsform hack ,但现在 esbuild 不支持这个 hack 了,有待进一步探索,cc @stormslowly

fz6m avatar Mar 31 '23 11:03 fz6m

请问这个issue有其他解决方案吗?

ClarenceAS avatar Jan 10 '24 05:01 ClarenceAS

目前没有解决方案,不推荐继续使用 jest 了,现在推荐使用 vitest 然后测试与 umi 不相关的纯组件,将 umi 的逻辑与组件或逻辑分离开 props 传递进去,而独立测试纯的部分。

fz6m avatar Jan 12 '24 21:01 fz6m