乐闻世界logo
搜索文章和话题

Jest 如何mock zustand的 store

4 个月前提问
3 个月前修改
浏览次数54

1个答案

1

在进行单元测试时,mocking 是一个常见的需求,尤其是涉及到外部依赖或复杂状态管理的场景。当使用 Jest 来测试使用了 Zustand 的 React 组件或其他 JavaScript 模块时,我们通常希望隔离这些测试,使之不依赖于实际的 store 状态。接下来,我将详细介绍如何使用 Jest 来 mock Zustand 的 store。

1. 创建 Mock Store

首先,我们需要创建一个 mock version 的 store。这个 mock store 应该模拟真实 store 的接口,但不需要实现所有的功能。

假设我们有一个 Zustand store 如下:

javascript
import create from 'zustand'; const useStore = create(set => ({ count: 0, increase: () => set(state => ({ count: state.count + 1 })), decrease: () => set(state => ({ count: state.count - 1 })) })); export default useStore;

为了测试,我们可以创建一个 mock 的 version:

javascript
// mockStore.js export const useMockStore = () => ({ count: 0, increase: jest.fn(), decrease: jest.fn() });

2. 在 Jest 测试中使用 Mock Store

接下来,在我们的测试文件中,我们需要告诉 Jest 使用这个 mock store 而不是真实的 store。我们可以使用 jest.mock() 方法来实现:

javascript
import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import ComponentUnderTest from './ComponentUnderTest'; import * as storeFile from './store'; // 导入我们的真实 store jest.mock('./store', () => ({ __esModule: true, default: jest.requireActual('./mockStore').useMockStore // 使用 mock store 替代 })); describe('ComponentUnderTest', () => { it('should display count', () => { const { getByText } = render(<ComponentUnderTest />); expect(getByText('Count: 0')).toBeTruthy(); }); it('should increase count on button click', () => { const { getByText } = render(<ComponentUnderTest />); const increaseButton = getByText('Increase'); fireEvent.click(increaseButton); expect(storeFile.default().increase).toHaveBeenCalled(); // 检查 mock function 是否被调用 }); });

3. 解释和注意事项

在上述的测试示例中,我们通过 jest.mock() 替换了整个 store 模块,使用了一个返回 mock functions(如 increasedecrease)的对象来模拟 store。在测试中,我们可以检查这些 mock functions 是否被正确调用,以此验证组件的行为。

需要注意的是,每次测试后应当使用 jest.clearAllMocks()jest.resetAllMocks() 来重置 mocks 状态,确保测试间的独立性。

总结

Mocking Zustand 的 store 使我们能够在隔离的环境中测试组件和模块,而不用担心 store 的具体实现和现有状态。这样可以确保我们的测试是可控和一致的,从而提高测试的质量和可信度。

2024年6月29日 12:07 回复

你的答案