如何为每个测试用例设置不同的Mock实现?
如何为每个测试用例设置不同的Mock实现?
我刚从Jest切换到Vitest的时候,也被这个问题卡过一阵,其实只要掌握正确的重置和设置方式,每个用例独立定制mock超简单!
先看你的代码结构,用vi.hoisted()来提升mock函数的写法是对的,这样vi.mock才能正确访问到f。要实现每个测试用例用不同的mock值,核心是避免用例之间的mock状态污染,然后在每个用例里单独设置返回值或实现。
给你调整后的完整代码示例:
// test.ts import { a } from './asd'; const { f } = vi.hoisted(() => ({ f: vi.fn(), })); vi.mock('../../../api/ApiProvider', () => ({ f, })); describe('Test', () => { // 每个测试用例执行前,重置mock的状态 beforeEach(() => { // mockReset会清空mock的调用记录和之前设置的返回值,保证每个用例从零开始 f.mockReset(); }); it('sample test case', () => { // 第一个用例设置mock返回42 f.mockReturnValue(42); // 这里根据你的实际逻辑写断言,比如a函数内部调用了f,所以预期对应的结果 expect(a()).toEqual(1); }); it('sample test case2', () => { // 第二个用例设置完全不同的返回值 f.mockReturnValue(100); expect(a()).toEqual(/* 这里填对应100返回值的预期结果 */); }); });
几个关键细节要注意:
- 如果你只是想清空调用记录,不想重置返回值,可以用
f.mockClear()代替mockReset(),根据你的测试需求选就行。 - 要是你需要的不是固定返回值,而是自定义的函数逻辑,把
mockReturnValue换成mockImplementation就好,比如:f.mockImplementation(() => { // 这里写第二个用例专属的mock逻辑 return '自定义返回'; }); - 不用
beforeEach的话,也可以在每个用例的开头手动调用重置方法,效果是一样的,只是用beforeEach更省心,不用重复写代码。
备注:内容来源于stack exchange,提问作者Stoil Radkov
相关产品推荐
相关产品推荐

