在业力旁边使用玩笑的冲突类型,Angular 上的茉莉花

Posted

技术标签:

【中文标题】在业力旁边使用玩笑的冲突类型,Angular 上的茉莉花【英文标题】:Conflicting types using jest next to karma, jasmine on Angular 【发布时间】:2020-02-22 01:24:58 【问题描述】:

背景

我正在从事一个起源于 angular.js 项目的项目。我们目前正在将所有内容迁移到 Angular。这意味着我们有 Angular.js 的遗留单元测试,最终将被删除。对于 Angular,我们已将所有测试迁移到 Jest。

问题

在项目中尝试同时将Karma and JasmineJest 一起使用时会出现问题。遗留单元测试与它自己的 tsconfig 文件连接起来,这些工作正常。两个库似乎都向全局环境添加了相同的功能,并且 Jest 测试以某种方式不断解析为 Jasmine 类型。如果我从项目中删除 Karma and Jasmine,所有测试都可以正常工作。

问题

我如何在运行 jest 时排除 jasmine's 之类的 expect 类型而不从项目中完全删除 karma and jasmine

我试过了

我有一个单独的 tsconfig.spec 文件用于我在 jest.config.js 文件中引用的开玩笑测试。在这我尝试只添加想要的类型。我认为只会加载node_modules/@types/<included>。但它仍然会包括茉莉花。

  "compilerOptions": 
    "types": ["node", "jquery", "jest"],

我也尝试通过typeRoots 包含它们,但这只会给我更多错误,例如:error TS2708: Cannot use namespace 'jest' as a value.


  "compilerOptions": 
    "outDir": "../out-tsc/spec",
    "typeRoots": [
      "../node_modules/@types/jest"
      ...
    ],
    "baseUrl": ".",
    "paths": 
      "*": ["./*"]
    ,
    "sourceMap": true,
    "declaration": false,
    "downlevelIteration": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "target": "es5",
    "emitDecoratorMetadata": true,
    "esModuleInterop": true,
    "allowJs": true
  ,
  "files": ["polyfills.ts"],
  "include": ["./app/**/*.spec.ts"]

不知何故,我似乎无法让 TypeScript 忽略 node_modules/@types/jasmine。任何帮助或指示将不胜感激。

【问题讨论】:

您是否尝试过 traceResolution 编译器选项来查看何时/从何处加载/引用 jasmine 类型文件? 我也遇到了类似的问题,因为我有一个 monorepo,它将我的 jest 和 jasmine @types 合并到一个 node_modules 文件夹中。您找到解决问题的方法了吗? 不,我们现在使用 jasmine 类型,直到我们可以完全删除它。那里有几个 Typescript 错误,我必须通过前缀 jasmine. 来修复它们。有一段时间了,但我认为像 jasmine.any(Function) 之类的东西。 【参考方案1】:

您可以使用 jest-without-globals 显式导入 describe、expect、it 和 test,覆盖这些符号的全局版本,否则这些符号将从 Jasmine 解析。

【讨论】:

以上是关于在业力旁边使用玩笑的冲突类型,Angular 上的茉莉花的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 angular-cli 只执行一个测试规范

如何解决冲突:使用开玩笑快照测试时“在源上删除,在目标上修改”?

Angular $scope 与文件输入类型冲突

SystemJS Typescript 输入冲突

将 Swiper 6 升级到 7 后,在单元测试(开玩笑)上找不到模块“swiper_angular”

开玩笑报道中意外发现的分支