我正在编写一个名为
然而,如果我模拟由Rollup生成的中间块,它就可以工作。
MyLibrary
的React库,并使用Rollup.js 2.58.3
进行打包。我使用jest
进行单元测试。
问题简要说明
我无法使用jest
模拟我的库中的模块。这是由于rollup "编译"代码的方式造成的。
Rollup使用其代码分割功能来创建许多块。例如,在一个示例中,rollup将Alpha.js
拆分为两个块:Alpha.js
和Alpha-xxxxxx.js
。原始文件中的一些功能被提取到此“中间”块(Alpha-xxxxxx.js
)中。
在我的单元测试中,当模拟移动到中间文件Alpha-xxxxxx.js
的任何方法时,jest
似乎实际上会从该“中间”模块而不是顶层模块加载模块。
这将导致测试失败。
例如,jest.mock('MyLibrary/dist/Alpha')
不起作用,因为模块实际上是从Alpha-xxxxxx.js
而不是Alpha.js
中加载的。
详细说明和示例
我在MyLibrary
中有两个模块Alpha.js
和Beta.js
。
MyLibrary/Alpha.js
export const Aaa = () => {
...
}
...
MyLibrary/Beta.js
import { Aaa } from './Alpha';
...
export const Bbb = () => {
...
}
...
Rollup生成的编译输出
当使用rollup.js打包时,Alpha.js
会被拆分成两个块:Alpha.js
和Alpha-xxxxxx.js
。由于代码拆分,Beta.js
的编译版本现在看起来像这样:
MyLibrary/dist/Beta.js
import { Aaa } from './Alpha-xxxxxx';
...
export const Bbb = () => {
...
}
...
从 MyLibrary
编译的这个模块已经被导入到了 MyApp
中,应用程序似乎正确导入并且正常工作。
MyApp/index.js
import { Bbb } from 'MyLibrary/dist/Beta'
...
问题
jest
测试以下内容失败,因为它没有正确地模拟Aaa
导出。
MyApp/index.test.js
import { Bbb } from 'MyLibrary/dist/Beta';
jest.mock('MyLibrary/dist/Alpha', () => ({
Aaa: jest.fn(),
}));
然而,如果我模拟由Rollup生成的中间块,它就可以工作。
import { stuff } from 'MyLibrary/dist/Beta';
jest.mock('MyLibrary/dist/Alpha-xxxxxx', () => ({
Aaa: jest.fn(),
}));
我应该如何在Jest测试中正确模拟我的库中的Alpha
?
import { Bbb } from 'MyLibrary/Beta';
等语句。 - hjrshngdist
文件夹中导入生成的文件到我们的应用程序中。在测试中使用相同的导入方式不是很合理吗? - wiseindy