我在 React 中有一些自定义钩子。我正在使用单元测试(Jest),我必须模拟这个钩子。
const theHook = () => {
// some code
return {func1, func2};
}
我发现下面两个例子不一样。
import theHook from '../theHook';
jest.mock('../theHook');
theHook.mockReturnValue({
func1: jest.fn(),
func2: jest.fn()
});
和
import theHook from '../theHook';
jest.mock('../theHook', () => ({
func1: jest.fn(),
func2: jest.fn()
}));
谁能给我解释一下这两种mock方式的区别?
实现时机:在第一个示例中,您先模拟模块,然后单独设置返回值。在第二个中,您直接在模拟定义中提供返回值。
模拟行为:在第一个示例中,如果您想在初始模拟后进一步自定义行为,您可以这样做,因为模块已被模拟但尚未定义。在第二个示例中,您在模拟后立即有一个固定的返回值。
当您想稍后在测试中定义模拟行为时,请使用第一种方法,特别是当您有多个测试可能需要同一钩子的不同返回值时。
对于更简单的情况,使用第二种方法,您希望预先定义模拟行为并且以后不需要更改它。