玩笑中模拟的范围是什么?

pga*_*mou 6 javascript unit-testing reactjs jestjs

总之,我想知道:

  1. 模拟是否包含在测试文件中或影响多个文件?
  2. jest 范围与 JavaScript 范围相同吗?最内部范围中的模拟优先于具有相同名称的外部/全局模拟。
  3. 一个后续问题可能是:哪些玩笑模拟方法适用于单元,哪些适用于局部和全局范围?

例如,在以下文件系统中:

rootFolder/
  node_modules/
    externalModule/
      - index.js
  __mocks__/
    - externalModule.js
  src/
    - fileA.js
    - fileB.js
    - internalModule.js
    __mocks__/
      internalModule.js
    __tests__/
      - fileA.spec.js
      - fileB.spec.js
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

  1. jest.mock('../internalModule, () => customImplementation)fileA.spec.js影响fileB.spec.js,反之亦然?
  2. 同样,jest.mock('externalModule', () => customImplementation)fileA.spec.js是否会影响fileB.spec.js,反之亦然?。做`jest.mock('模拟外部模块(node_modules)
  3. 全局模拟如何工作?它们会自动跨文件加载还是我必须明确jest.mock('externalModule')地进行初始化
  4. jest.mock('externalModule', () => customImplementation)优先于全局模拟吗?它会覆盖跨文件的全局模拟吗?
  5. jest.spyOn(internalModule, 'someFunc').mockImplementationOnce(..)在单元的整个生命周期内模拟实现还是只调用一次就someFunc()可以重置功能?
  6. 根据文档jest.doMock,与jest.mock,不会提升模拟“向上”。但是,上哪儿呢?文件?它会在单元结束时自动解除模拟或重置吗?还是会影响未来的单位?
  7. jest.unmock('externalModule')全球嘲笑,重置为每个文件?

我见过非常不一致的行为,并且没有明确解释这一点的文档。此外,我发现文档要么到处都是,要么不够具体。

提前致谢。

PS 我发现了其他具有类似标题的问题,例如如何将 Jest 模拟函数的范围限制为单个测试模拟函数时 Jest 中的范围,但它们没有回答我的问题。

Dro*_*ets 2

除非开发人员明确包含,否则规范文件与其他规范隔离运行。

这里的例外是,可以设置全局变量来运行。

有效地将规范中的每个测试视为其自己的应用程序。

他们不应该互相影响。但是,如果您导入一个文件,该文件会导入另一个文件(依此类推),所有这些文件都将参与测试并可能影响结果(取决于这些文件的作用/行为,但这就是我们进行测试的原因 - 找出答案)。