如何解决 Testcafe 和 Jest 之间的类型冲突? (“无法重新声明块范围变量'test'”)

Posted

技术标签:

【中文标题】如何解决 Testcafe 和 Jest 之间的类型冲突? (“无法重新声明块范围变量\'test\'”)【英文标题】:How do I resolve a type conflict between Testcafe and Jest? ("Cannot redeclare block-scoped variable 'test'")如何解决 Testcafe 和 Jest 之间的类型冲突? (“无法重新声明块范围变量'test'”) 【发布时间】:2021-11-19 07:14:33 【问题描述】:

我有一个使用 Vue CLI 创建的 Vue 2 项目,它已经进行了一段时间的 Testcafe 测试。 现在我也在尝试添加 Jest 测试。

当我运行我的应用程序 (npm run serve = vue-cli-service serve) 时,由于 Jest 和 Testcafe 都声明了全局 test() 函数,我收到以下 Typescript 错误:

ERROR in /Users/.../app/node_modules/@types/jest/index.d.ts(44,13):
44:13 Cannot redeclare block-scoped variable 'test'.
    42 | declare var fit: jest.It;
    43 | declare var xit: jest.It;
  > 44 | declare var test: jest.It;
       |             ^
    45 | declare var xtest: jest.It;
    46 |
    47 | declare const expect: jest.Expect;
ERROR in /Users/.../app/node_modules/testcafe/ts-defs/index.d.ts(2397,15):
2397:15 Cannot redeclare block-scoped variable 'test'.
    2395 |
    2396 | declare const fixture: FixtureFn;
  > 2397 | declare const test: TestFn;
         |               ^
    2398 |
Version: typescript 3.7.5

有 an old Testcafe 问题说这已在 2019 年修复,并且:

在编译任何 TypeScript 源文件时,默认情况下只会自动加载来自 node_modules/@types 目录的定义。

但是,正如您在上面看到的,我的配置仍在从 node_modules/testcafe/ts-defs/index.d.ts 加载 Testcafe 类型,即使我没有运行 Testcafe 而只是运行应用程序。

我创建了一个有同样问题的骨架 Vue 2 应用程序并将其上传到 Github here。 直到我在 tests/testcafe/Testcafe.spec.ts 添加测试后才出现类型问题。

我能做些什么来摆脱这种类型冲突?在运行应用程序时,我可以做一些简单的事情来停止加载 Testcafe 类型吗?

【问题讨论】:

【参考方案1】:

在我的项目中,将"tests/testcafe" 添加到tsconfig.json 中的exclude 属性会停止运行开发服务器时出现的错误,并且TestCafe 测试仍将运行(这很令人惊讶)。所以我想告诉 Typescript(由 Vue CLI / Webpack 运行?)不要编译 Testcafe 测试是一个答案。

我觉得可能还有另一个答案是忽略 TestCafe 的类型,但我不知道如何实现。 (我尝试了几种不同的方法。)

【讨论】:

以上是关于如何解决 Testcafe 和 Jest 之间的类型冲突? (“无法重新声明块范围变量'test'”)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest 模拟 Es6 类

使用 MSW 和 Jest 时如何在请求之间的测试中清除 RTK 查询缓存?

使用 Jest、AudioContext 进行测试和模拟

如何使用 Testcafe 测试推送通知

如何在 TestCafe 中发布顺序 POST 请求?

如何使用 NodeJS 解决 Supertest 和 jest 中的 ECONNREFUSED 错误?