在JEST中模拟模块时如何解决模块依赖性

时间:2019-09-09 13:01:14

标签: typescript jestjs node-modules

我有一个node模块分辨率。并准备下一个模块:

A/
  A.tsx
  index.ts
B/
  B.tsx
  index.ts
  text.tsx
// A/A.tsx

export const A = '1'
// A/index.tsx

export {A} from 'A'

因此,B.tsx包括A.tsx

// B.tsx


include {A} from '../A'

// ...usage

现在,我想用UT来介绍B。我为此开玩笑。

因此,在整个测试过程中,我想模拟A模块。我可以使用几种方法来做到这一点:

  1. 直接在测试文件中重新定义:
//test.tsx


jest.mock('../A', () => ({
  A: () => <div id='A' />
}))

可以!

  1. __mocks__文件夹中创建一个模拟文件

因此,我必须在与__mocks__文件夹相同级别上创建一个A文件夹,并在其中创建A.tsx文件。

__mocks__/
A/
B/

并将该模拟包含在测试中:

// test.tsx


jest.mock('../A')

因此,该方法无效。而且,由于模块分辨率,它似乎不起作用,因为如果我直接包含A模块,例如:

// B.tsx

import {A} from '../A/A'

并将模拟文件A.tsx移至A/__mocks__/A.tsx

并更改模拟:

// test.tsx


jest.mock('../A/A')

然后,一切正常。

因此,任务是以某种方式修复模块分辨率。

1 个答案:

答案 0 :(得分:1)

节点尝试解决此模块:

../A

...并检测到它是a folder that doesn't have a package.json so it loads index.js

这意味着该行:

../A

...也可以这样写:

../A/index

因此,要创建一个Manual Mock,您应该在此处创建模拟对象:

../A/__mocks__/index.ts

...并且在测试中调用该模拟时将使用该模拟:

jest.mock('../A');  // <= uses the mock at ../A/__mocks__/index.ts