显然,mock.mockRestore()不会还原使用jest.mock()创建的模拟的原始实现
// a.js
export default class A {}
// b.js
import A from './a';
export default class B extends A {}
// test.js
import A from './a';
import B from './b';
jest.mock('./a');
jest.mock('./b');
const b = new B();
test('instanceOf', () => {
A.mockRestore();
B.mockRestore();
expect(b).toBeInstanceOf(A); // fails
});
答案 0 :(得分:0)
mockFn.mockRestore
仅适用于使用jest.spyOn
创建的模拟函数:
const obj = {
func: () => 'original'
}
test('func', () => {
const mock = jest.spyOn(obj, 'func');
mock.mockReturnValue('mocked');
expect(obj.func()).toBe('mocked'); // Success!
mock.mockRestore();
expect(obj.func()).toBe('original'); // Success!
})
jest.spyOn
包装了原始功能,并提供了mockRestore
作为恢复原始功能的方法。
jest.mock
的调用方式有所不同。
Jest
接管require
系统,jest.mock
告诉Jest
,它在需要时应返回模块模拟,而不是实际模块。
这意味着模块模拟不会包装原始模块,它会完全替换require
系统中的原始模块。因此,mockRestore
可以在模拟模块中的模拟函数上定义,但是调用它不会恢复原始实现。
jest.mock
通常在您要为整个测试模拟整个模块时使用。
在使用ES6样式的import
语句时,这特别有用,因为babel-jest
会提升jest.mock
调用,并且它们会在测试文件中的其他任何内容(包括任何import
语句)之前运行):
import A from './a'; // <= A is already mocked...
jest.mock('./a'); // <= ...because this runs first
test('A', () => {
// ...
}
在使用jest.mock
的测试过程中,没有一种简单的方法可以还原原始模块,因为它的主要用途是为整个测试模拟模块。
如果您在同一测试中尝试同时使用模拟和原始实现,则有几种选择:
jest.spyOn
模拟一个特定功能,然后使用mockRestore
还原它jest.doMock
来避免jest.mock
的举升行为……请注意,您还需要在使用require
的范围内使用jest.doMock
而不是顶部级import
jest.requireAcutal
来require
原始模块