Jest: [bug]在单独的目录中发现重复的手动模拟

创建于 2016-11-09  ·  66评论  ·  资料来源: facebook/jest

您是否要请求功能或报告错误 虫子

目前的行为是什么?

给定一个文件树:

src/app/modules
├── module1
│   ├── index.js
│   ├── __tests__/
├── module2
│   ├── index.js
│   ├── __tests__/

我通过按目录名导入modules目录之外的模块来使用它们:

import Module1 from '../modules/module1';
import Module2 from '../modules/module2';

我希望能够模拟module1module2 。 但是,如果我创建src/app/modules/module1/__mocks__/index.jssrc/app/modules/module2/__mocks__/index.js ,则会从jest-haste-map得到duplicate manual mock found错误。

但是,如果我尝试创建src/app/modules/__mocks__/{module1.js,module2.js} ,则不会使用模拟文件。

如果当前行为是错误,请提供步骤来重现,并在可能的情况下提供GitHub上的最小存储库,我们可以使用npm installnpm test

参见上述行为。

预期的行为是什么?

考虑到第一种情况使用不同的路径,第二种情况使用模块的路径名,我希望这两种方法都能起作用。

再次使用--debug运行Jest并提供其打印的完整配置。

节点v6.2.0
npm v3.8.9
OS X 10.11.6

> NODE_ENV=test jest --env jsdom "--debug" "src/app/redux/modules/devices"

jest version = 17.0.0
test framework = jasmine2
config = {
  "moduleFileExtensions": [
    "js",
    "json"
  ],
  "moduleDirectories": [
    "node_modules"
  ],
  "moduleNameMapper": [
    [
      "^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$",
      "/Users/paul/dev/tools/jest/mock-assets.js"
    ],
    [
      "^.+\\.css$",
      "identity-obj-proxy"
    ]
  ],
  "name": "dev",
  "setupTestFrameworkScriptFile": "/Users/paul/dev/tools/jest/setup-framework.js",
  "testPathDirs": [
    "/Users/paul/dev/src"
  ],
  "testRegex": "/__tests__/.*\\.test\\.js$",
  "timers": "fake",
  "rootDir": "/Users/paul/dev",
  "setupFiles": [],
  "testRunner": "/Users/paul/dev/node_modules/jest-jasmine2/build/index.js",
  "testEnvironment": "/Users/paul/dev/node_modules/jest-environment-jsdom/build/index.js",
  "transform": [
    [
      "^.+\\.jsx?$",
      "/Users/paul/dev/node_modules/babel-jest/build/index.js"
    ]
  ],
  "usesBabelJest": true,
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/dm/vt920lmd6tzdq_709zkykwx40000gn/T/jest",
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "expand": false,
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "resetMocks": false,
  "resetModules": false,
  "snapshotSerializers": [],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testURL": "about:blank",
  "transformIgnorePatterns": [
    "/node_modules/"
  ],
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "cache": true,
  "watchman": true,
  "testcheckOptions": {
    "times": 100,
    "maxSize": 200
  }
}
jest-haste-map: duplicate manual mock found:
  Module name: index
  Duplicate Mock path: /Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js
This warning is caused by two manual mock files with the same file name.
Jest will use the mock file found in:
/Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js
 Please delete one of the following two files:
 /Users/paul/dev/src/app/modules/image-file/__mocks__/index.js
/Users/paul/dev/src/app/modules/push-notification-manager/__mocks__/index.js


No tests found
  1 file checked.
  testPathDirs: /Users/paul/dev/src - 1 match
  testRegex: /__tests__/.*\.test\.js$ - 0 matches
  testPathIgnorePatterns: /node_modules/ - 1 match
Enhancement Confirmed Help Wanted

最有用的评论

这似乎对我有用。 在jest.config.js中:

module.exports = {
  // ...
  modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};

我不确定此更改的范围或影响,因为我有一个小项目。

所有66条评论

+1

就我而言,清除cacheDirectory / var / folders / dm / vt920lmd6tzdq_709zkykwx40000gn / T / jest并重新安装npm依赖项后,这些消息已消失。

这是令人反感的代码:

https://github.com/facebook/jest/blob/cd8976ec50dbed79cfe07f275052cdd80d466e73/packages/jest-haste-map/src/index.js#L98

但是,似乎有明确的测试可能需要该行为,因为有一个测试可以证实这一点:

https://github.com/facebook/jest/blob/8de90b320c87a0a36d68f6bd8177620a985df269/packages/jest-haste-map/src/__tests__/__snapshots__/index-test.js.snap#L15

其中添加:

https://github.com/facebook/jest/commit/cfade282fbbe2737b6dd2cee1cf3da3ee8624512

我想知道为什么我们使用basename而不是整个路径作为键?

/ cc @flarnie

这意味着使用手动模拟时,模块的basename s在项目中必须是全局唯一的。 对于我的用例,这意味着我不能做类似的事情:

import { MyWhatever } from 'models/MyWhatever/schema';
import { MyOtherWhatever } from 'models/MyOtherWhatever/schema';

并同时使用手动模拟。 Jest目前会把它们都当成嘲笑schema并抱怨。

尽管解决方法很简单(s / schema / MyWhateverSchema /),但感觉就像是重新命名和重组非测试代码以使开玩笑满意的错误。

是的,的确确实很烂。 手动模拟系统真的不好,我很乐意接受可以改善这种情况的PR,前提是我们可以确保不破坏所有FB(但我可以解决这一问题:))

凉。 明天我可能会花些时间做些补丁,但是虽然没有任何承诺😅

@cpojer是有一个特殊的原因这种行为

它与fb为模块使用唯一的文件名有关吗? 我没有看到否则不允许同名的两个模拟有什么道理...

是的,模拟也是“全局”的。 不幸的是,这是我们必须忍受的可怕设计。 在FB,我们有4000多个模拟文件放在错误的位置(并且甚至没有正确的位置)。 我们很可能会在下半年初修复此问题,因此Jest应该会对此有所改善。 如果我们现在可以保留FB上Jest的旧行为,我很乐意支持改善Jest开源行为的PR。

@cpojer的标志呢? 您会接受带有标志来启用/禁用此功能的PR吗?

是的,它应该是一个配置选项。 但是,我不仅在谈论警告,而且在总体上谈论该功能。

@cpojer对-这与笑话的哪个部分有关?

解析代码是从jest-runtime调用的: https :

@cpojer感谢您的指针:+1:

@cpojer某些全局替代(例如JEST_USE_BASENAME_FOR_CACHING )来切换此行为呢?

至少,我们可以使用非唯一的文件名,并且它不会破坏FB中的任何内容。

当然,这是一个临时解决方案。

我的意思是,这是在某些/etc/profile~/.bashrc

export JEST_USE_BASENAME_FOR_CACHING="true"

(或带有env的某些文件)
接着

$ jest

或没有修改env文件的此文件:

$ JEST_USE_BASENAME_FOR_CACHING="true" jest

你认为呢? 这是一种骇客还是可以吗? :眨眼:

我刚刚尝试了一个新的repo ,使用了两个版本的jest( ^15.0.0^17.0.0 ),尽管后者发出了警告,但测试的行为符合预期。

@ColCh我不认为这里的问题与缓存有关,可能更合适的名称可能是JEST_USE_BASENAME_FOR_MOCKING

@cpojer,如果FB代码对名称的唯一性有限制,则使用完整路径作为

我是对的还是没有看到什么?

我看到的两个解决方案是:

  • 修改getMockName以适应使用基本名或完整路径的选项
  • 完全删除该功能

很高兴看到@cpojer的回答

嗨,大家好,抱歉耽搁了,现在我已经有了很多东西作为后盾。

我想,如果你们决定在Jest中进行任何重大更改,而这些更改是改进此系统所必需的,那我很好。 手动模拟确实搞砸了,无法正常工作。 我们想要做的一件事是使用config选项(例如"haste_modules": ['path/a', 'path/b']" )限制“急速模块”(内部FB模块系统)的范围,然后仅查看那些文件夹中的急速模块,包括此奇怪的模拟行为。 如果有人要进行更改,那将是惊人的。

然后要弄清楚的一件事是:如果所有手动模拟都是本地的,例如__mocks__/a.js映射到a.js ,那么我们如何使用node_module模拟呢? 为此,有两种方法:

  • 引入一个新的__node_modules_mocks__文件夹,但这很丑陋。
  • rootDir (项目根目录)看,顶层__mocks__文件夹可以用作全局文件夹。

总结一下:

  • 让我们在Jest中修复手动模拟吧!
  • 让我们命名空间的仓促模块并将它们限制在某些文件夹/正则表达式中。
  • 确保当前的模拟行为仍适用于FB,即使那意味着我们必须将某些文件夹列入白名单以加快工作速度(我想现在对于我们来说看起来像["<rootDir>"]
  • 弄清楚如何仍然能够模拟节点模块。

你怎么看?

为了:

  • 让我们在Jest中修复手动模拟吧!

欢呼声:微笑::tada:

  • 让我们命名空间的仓促模块并将它们限制在某些文件夹/正则表达式中。
  • 确保当前的模拟行为仍适用于FB,即使这意味着我们必须将某些文件夹列入白名单以加快工作速度(它看起来像[[“]现在,我们认为)

我不确定我是否急于理解需求。
您的意思是可以说“那些模块是仓促的模块”吗?
如果我们有四个模块: /path_1/a/path_1/b/path_2/a/path_2/c ,并且设置为

"haste_modules:" ["/path_1/a", "/path_2/c"]

/path_1/a/path_1/b被限制为仅存在于/path_1 ,因此/path_2/c是有效的,而/path_2/a会引发错误/警告。

我想说的是,即使使用单/双* ,目标也可以很容易地是特定的文件和整个目录。

  • 弄清楚如何仍然能够模拟节点模块。

我会保持当前行为

如果您要模拟的模块是节点模块(例如:fs),则模拟应与node_modules文件夹放置在同一父目录中。

我的想法:

仓促模块:

我认为haste_modules很不错,就像collectCoverageFrom和其他选项一样适合:数组数组
如果您将所有src作为_haste_模块,并且只有一个目录是非匆忙的:

haste_modules: [
  "src",
  "!src/foo"
]

node_modules

@EnoahNetzach如果某人的应用程序模块和node_modules中的模块具有相同的名称怎么办?


为了使它工作而不会仓促...嗯,我认为可以这样描述:

给定节点模块project/node_modules/react ,模拟将在project/__node_modules_mocks__/react.js
如果您有文件project/react.js ,则使用project/__mocks__/react.js

(当然, react.js是一个示例。这里可以是所有模块中的任何文件名,可以从npm安装)

真的,根据我的经验,嘲笑node_modules模块是一种罕见的情况,所以...在嘲笑node_modules的特定情况下,可能是_rareness_可以补偿

有人经常在node_modules内部嘲笑模块吗?

怎么想

正如我注意到的那样,对于本机项目,我们常常不得不模拟application modules并保留来自node_modules的模块lodash

这意味着,我们有:

  • 手动为每个哑部件创建模拟部件(哑部件是布局部件)
  • 每个测试文件中一长串的jest.mock通话

__我想说____:在某些路径上具有_auto嘲笑_模块的能力将是非常好的。

可以围绕config中的众所周知的数据结构(jest-globs)数组实现,并在其上过滤模块。

我将逐步描述

给定此配置条目

"autoMockingPaths": [
  "src/components/dumb/**/*.js",
]

而此代码为src/screens/app.js

import _ from 'lodash';
import Button from '../../components/dumb/button.js';

// blah blah AppScreen implementation skipped

屏幕的测试代码为src/screens/__tests__/app-test.js

import AppScreen from '../app.js';

describe('AppScreen', () => /* testing app screen */);

我们在app-test.js情况下遇到这种情况:

  • AppScreen没有被嘲笑
  • lodash没有被嘲笑
  • Button AppScreen必需的Button被模拟

...您可以回答,它将如何与automock配置项一起播放?

简单地说, automock: true等效于:

"autoMockingPaths": [
  "<rootDir>"
]

自动嘲笑...等等!

可能只是为automock引入了特殊价值? 至少不会破坏人们的配置

例如,使用以下配置条目:

automock: "app"

jest将自动模拟所有应用程序模块,并保留模块的实际版本从node_modules

您如何看待应用程序级模块自动模拟@cpojer ? 我发现这对我的特定案例非常有效。

我完全同意"haste_modules"

我们个人并没有使用太多的自动模拟功能,所以我不能说有什么更好的选择,我的疯狂猜测是"autoMockingPaths" var可能有用且足够有弹性。
相反,我发现"automock": "app"太僵硬了(开玩笑地默认情况下已禁用自动嘲笑)。

__node_modules_mocks__可能是一个选择,我同意稀有性弥补丑陋(在我的特殊情况下,我们很少嘲笑node_modules ,并且在必须这样做时,我们使用jest.mock(...) )。
唯一需要注意的是:当您拥有嵌套的node_modules文件夹(例如src/node_modules )时,会发生什么,您是否必须从全局__node_modules_mocks__的嵌套版本中模拟其模块?它,还是通常与__mocks__并置?

如果有人在node_modulesapp modules具有相同的模块名称,则可能只是抛出

例如

app/express.js作为应用程序模块(可能是我在做火车游戏)
app/node_modules/express作为npm的网络服务器
throw new Error("can't mock express.js file - it duplicates one from node_modules")

在这种情况下, __mocks__可以用于node_modules ,但是开发人员必须在发生这种冲突时重命名自己的模块

不,这比__node_modules_mocks__丑陋,不是吗?

我的意思是:如果您有一个npm install ed模块x ,然后在代码库的更深处,则在嵌套的node_modules文件夹中定义一个模块x

命名冲突通常是通过优先选择最接近的节点在节点中处理的,但我不知道这是如何迅速进行的。

我之所以提出这个建议,是因为像Create React App这样的项目正在使用它,或者将在不久的将来使用它。

从侧面说, @ cpojer与这个问题有某种联系吗?

让我们继续关注更改仓促工作的方式(白名单/黑名单,而不是默认情况下启用)。 我确实认为我希望保持<rootDir>/__mocks__应该是节点模块模拟的默认值。 我们也可以使它成为配置选项:“ globalMocks”,默认为<rootDir>/__mocks__ 。 有人愿意为此工作吗?

我应该能够在下个周末之前完成这项工作。

这个星期天我可以从事公关工作,我有空

@cpojer只是回顾一下-创建globalMocks配置项,默认值为<rootDir>/__mocks__ 。 此选项通过指定路径来在玩笑中调节node-haste 。 否则它将是路径数组?

我认为这些是解决此问题的方式上的一些较大更改,但我认为我们既需要单数globalMocks选项(可以是字符串,也可以是字符串数组)和hasteModules选项(必须是haste模块的路径数组)。 这些代码大部分都存在于jest-haste-map和jest-resolve中。 我不确定100%正确的解决方案会是什么样子。


来自:Max Sysoev [email protected]
发送:2016年12月9日星期五8:18:44 AM
至:facebook / jest
抄送:克里斯托夫·波耶(Christoph Pojer); 提到
主题:回复:[facebook / jest] [bug]在单独的目录中发现重复的手动模拟(#2070)

这个星期天我可以从事公关工作,我有空

@cpojer https://github.com/cpojer只是要回顾一下-创建默认值为的globalMocks配置条目/ __模拟__。 此选项通过指定路径来调节笑话中节点加速的使用。 否则它将是路径数组?

--
您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub https://github.com/facebook/jest/issues/2070#issuecomment-265958606上查看,或忽略线程https://github.com/notifications/unsubscribe-auth/AAA0KAMFc34iKqBDLHZzgaGHqyc3WkAzks5rGQ7kgaJpZM4Kt2DW

抱歉,我的工作站坏了,显然在几个月(1-2个月)内无法正常工作。 我什至在此PR上丢失了我的项目:(因此,很抱歉承担责任。

只是一个用于更改getMockName行为的配置选项呢?

不太了解jest的内部结构,但这似乎是解决该问题而不破坏FB的jest的最简单解决方案。

这将比我原先想的要复杂。 对我来说,手动模拟也应该替换它们最近的文件。 像这样的东西:

{ 'aws-sdk': '/Users/project/__mocks__/aws-sdk.js',
  'slack': '/Users/project/__mocks__/slack.js',
  '/Users/project/db/index': '/Users/project/db/__mocks__/index.js',
  '/Users/project/slack/index': '/Users/projects/slack/__mocks__/index.js' }

require('aws-sdk')应该解析为/Users/project/__mocks__/aws-sdk.js这是对node_module的模拟。

require('./db') (或db任何路径)应解析为: /Users/project/db/__mocks__/index.js

我对设置Jest手动模拟的方式的理解(如果使用上述类似方法,可能应该有更多文档),因为它们应尽可能靠近__mocks__目录中的模拟文件。

手动模拟是通过将模块写入紧邻该模块的__mocks __ /子目录中来定义的。 (https://facebook.github.io/jest/docs/manual-mocks.html)

鉴于此,上述行为对我来说最有意义。

有什么想法吗?

这是实现上述功能的第一步: https :

它破坏了大多数笑话单元测试,因为它不再允许如下所示的纯“命名”模拟: https :

IMO,类似于createRuntime是一种测试实用程序,应该放在test utils文件夹中,并在需要它的测试中导入。 作为手动模拟的实现方式对我来说并没有真正意义,因为应该保留一些东西。

一种选择是添加一个配置变量,该变量将在现有行为和上述更改的清理版本之间切换。 我不太确定该怎么称呼。

我们无法打破当前的行为,因为我们在Facebook上非常依赖它。

@cpojer我同意。 在阅读以下代码后,我并没有真正理解此评论: https :

两个新的配置选项呢?

  • fullPathMockResolution (默认为false以保持现有行为)
    加上:
  • namedMockDirectories :如果启用了fullPathMockResolution则该阵列中的任何目录都将使用现有行为进行解析。 对于FB用例,就像您上面提到的那样,它就是[<rootDir>]

这使开发人员可以选择完整路径解析,因此不需要通过现有的jest安装进行更改,并且可以根据需要启用特定目录的现有行为。

cc @voideanvalue这可能是您必须考虑的事情(命名空间手动

+1,有没有办法解决这个问题?

+1

有关如何解决此问题的任何更新? 如果遵循这样的结构,那真是很痛苦:

project/
├── models
│   ├── index.js
│   ├── __mocks__/
│   │   ├── index.js/
├── challenges
│   ├── index.js
│   ├── __mocks__/
│   │   ├── index.js/

现在,如果我使用两个带有“冲突”名称的模块,则我必须在测试中手动模拟一个模块,即使它们实际上没有冲突的名称,因为应该考虑路径。

干杯,
多米尼克

@cpojer这里有更新吗? 有解决方法吗?

我的一个小解决方法是使用require模拟模块

jest.mock('models/index', () => require('models/index/_mocks_/index'));

我将__mocks__文件夹名称重命名为_mocks_以免开玩笑。

有一天,我将_mocks_重命名__mocks__并将需要的部分从jest.mock中删除

首先:感谢您所做的所有出色工作。
其次:这确实非常令人沮丧。 当模拟文件与整个代码库中也被模拟的任何其他文件共享名称时,我发现自己被迫在测试文件中使用jest.mock。 吊装也不允许导入实际的模拟,因此它迫使您在需要模拟该文件的任何两个测试中复制该模拟,这增加了测试套件的脆弱性。 我们正在解决这个问题吗? FB是否使用这些东西? 如果是,那怎么办? 😞

+1非常令人沮丧,无法看到这些警告。 等不及要修复了。

我认为我遇到的问题与以下内容有关:

如果我有一个jest.mock('src / utils / history'),它也会错误地模拟'history'node_module。

https://github.com/cwmoo740/jest-manual-mocks-node-modules

你们有更新吗?

@masoudcs我认为这摆脱了警告:

package.json

"jest": {
  /* other settings ... */
  "modulePathIgnorePatterns": ["<rootDir>/node_modules/react-native/Libraries/Core/__mocks__"]
}

modulePathIgnorePatterns数组中添加“重复”文件夹,警告将消失

谢谢@brunolm

所以这只是一个警告,对吗?
我只想确保这不会导致不好的事情发生,即在多个目录中模拟index.js:
src/app/modules/module1/__mocks__/index.jssrc/app/modules/module2/__mocks__/index.js

我不知道这是否重要,但是当我运行它时,它说它只会选择另一个,而我列出的这个方法都会被忽略。

因此,我认为告诉它忽略是很好的,无论如何它都没有使用它。

是的,就像您说的一样,到目前为止,我们还没有遇到任何问题。
希望它正在做它必须做的事! :)
谢谢

我尝试了最后两个提交的建议,但没有删除警告。

jest.mock('dir/index', () => require('dir/__mocks_/index'));

我看到此警告是因为我使用GitBook( ./_book目录),即使我的配置中有testPathIgnorePatterns: ['/_book/', ...otherStuff] 。 略过此问题,我看不到明确的解决方法。 我只想停止看到警告-任何帮助将不胜感激。

+1

这事有进一步更新吗?

另外,仍在寻找修复程序,以便可以以常规方式导入我的测试文件,而不是使用上面建议的更脏的方法。

jest.mock('models/index', () => require('models/index/_mocks_/index'));

我们的目录结构与@dkundel的引用相同,在此处引用https://github.com/facebook/jest/issues/2070#issuecomment -301332202,其中模型和组件位于其自己的命名空间中,默认index.js出口。

宁愿不要使警告保持沉默,也不要将所有模拟放到平面目录中。 我们的某些模拟被深层嵌套,建议的解决方法可能看起来像
jest.mock('pages/index/components/Component', () => require('pages/index/components/Component/_mocks_/index'));
在我们的结构中。

任何单词?

@karomancer我已经提交了PR#6037,它将使您能够使用配置来删除警告。 到目前为止,它还没有被合并。 我正在等待贡献者的回应。

这个问题非常令人沮丧,但是我想我已经找到了一种不错的解决方法,可以使命名约定更加简洁。

package.json

{
  "jest": {
    "setupFiles": [
      "<rootDir>/test.mocks.ts"
    ]
  }
}
/* test.mocks.ts */

// modules mocked before every test
// use `jest.unmock(...)` to undo for any single test case
const mockedModules = [
    "./path/to/module1/index.ts",
    "./path/to/module2/index.ts",
];

mockedModules.forEach((path) => {
    const mockPath = path.replace(/\.ts$/g, ".mock.ts");
    jest.mock(path, () => require(mockPath));
});

这将允许您通过创建同级anything.mock.ts并在顶级test.mocksmockedModules数组中添加原始路径来模拟anything.ts

为什么将此问题标记为增强功能?

这似乎对我有用。 在jest.config.js中:

module.exports = {
  // ...
  modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]
};

我不确定此更改的范围或影响,因为我有一个小项目。

@amccloud谢谢! 这解决了我的问题! 详细信息如下。

我的项目根目录中有一个模块helpers 。 助手正在导出函数parseNodeFromString
我已经在其他模块本地文件helpers 。 然后我嘲笑了我的一项测试。 使用函数parseNodeFromString所有测试开始失败,并显示以下错误:

FAIL  src/some_dir/bla/tests/SomeClass.test.js
  ● Test suite failed to run

    TypeError: (0 , _helpers.parseNodeFromString) is not a function

那这个问题呢? 好像@amccloud解决方案是正确的。

modulePathIgnorePatterns: ["<rootDir>/.*/__mocks__"]

尽管此解决方案有效,但它使节点模块的顶级模拟失败了。 所以我将其更改为不忽略带有"modulePathIgnorePatterns": ["<rootDir>/src/react/.*/__mocks__"],根__mock__文件夹。 仍然很奇怪的是,模拟不仅基于从根开始的完整路径而独特。 常见的是: users/helper.jsposts/helper.js 。 警告确实占用了一些空间,我不想完全隐藏实际警告。

那么PR的现状如何? 有什么适当的解决方案还是只有一些技巧?

就我而言,模拟模块在每次构建时都复制到Dist目录中。

看来这是打字稿无法排除属于更深的dir结构的路径/模式的问题。 “ typescript@^3.4.5”仍然是一个问题。

为了解决这个问题,我开始在每次测试前用“ rimraf dist”清理Dist目录。

"test:unit": "npm run clean && stencil test --spec --snapshot",

我知道它是一个hack,但是可以。

嘿,我解决了这里发生的事情,也许它可以帮助您重复此操作。

三种解决方案或方案:

1,我在文本编辑器上两次编辑了我的应用程序,这意味着我从两个不同的窗口运行pod install / update和react-native run-ios。 我收到此错误,我尝试在Xcode和我的应用程序中搜索重复的文件,但找不到任何文件。 因此,我只是从模拟器中删除了该应用程序,然后重新运行了react-native run-ios,它就可以正常工作。事实证明,我的scr文件中已复制了两个node_modules,例如:node_modules和node_modules0。

2,有时当我在Mac上按随机键时,例如在SRC文件夹中复制了node_modules,所以情况也是如此,因此,有必要查看文件夹中是否有任何node_modules重复项。

3,我无法启动我的应用程序,直到在同一模拟器上启动并终止了另一个应用程序,然后我通过重复启动重新启动了该应用程序,然后启动该应用程序而没有任何错误。

依然没有? 无法在CRA中使用modulePathIgnorePatterns

3年10个月

或者,如果我们可以强制Jest在出现此问题时抛出错误,而不只是警告,那将是很好的。 警告很容易被忽略; 在我的项目中,我希望抛出一个错误,因此引入该错误的开发人员必须对此进行处理。

此页面是否有帮助?
0 / 5 - 0 等级