You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Sinon监视JavaScript导出函数调用?附Redux测试示例

如何用Sinon监视Redux combineReducers的调用并验证参数

没问题,我来帮你搞定这个Sinon监视的问题!你的目标是验证combineReducers是否被正确传入{user}调用,核心在于提前mock掉Redux模块里的combineReducers,并用Sinon spy捕获它的执行,具体步骤如下:

方案1:使用Proxyquire(适配CommonJS/ES模块)

Proxyquire是专门用来在测试中替换模块依赖的工具,非常适合这类场景。首先确保你已经安装了它:

npm install proxyquire --save-dev

然后修改你的测试代码:

import sinon from 'sinon';
import proxyquire from 'proxyquire';

describe('API Reducer', () => {
  it('calls combineReducers on modules', function() {
    // 1. 创建一个Sinon spy,用来捕获combineReducers的调用
    const combineReducersSpy = sinon.spy();

    // 2. 使用proxyquire导入你的reducer模块,同时替换redux的combineReducers为我们的spy
    // 注意:替换成你实际的reducer文件路径
    const apiReducer = proxyquire('./path-to-your-reducer-file', {
      'redux': {
        combineReducers: combineReducersSpy
      }
    }).default;

    // 3. 断言调用:因为模块导入时就会执行combineReducers,所以直接验证即可
    sinon.assert.calledWith(combineReducersSpy, { user });
  });
});

方案2:Jest + Sinon(如果你的项目用Jest测试)

如果你的项目已经在用Jest,也可以结合Jest的mock功能来实现,不需要额外安装Proxyquire:

import sinon from 'sinon';
import { combineReducers } from 'redux';

// 提前mock Redux模块,把combineReducers替换成Sinon spy
jest.mock('redux', () => ({
  combineReducers: sinon.spy()
}));

// 导入你的reducer模块(此时combineReducers已经是spy了)
import apiReducer from './path-to-your-reducer-file';

describe('API Reducer', () => {
  it('calls combineReducers on modules', function() {
    // 直接验证spy的调用参数
    sinon.assert.calledWith(combineReducers, { user });
  });
});

关键注意点

  • 必须在导入目标模块前设置spy:因为你的reducer模块在被导入时,会立即执行combineReducers({user}),如果spy设置晚了,就会错过这次调用。
  • 路径要准确:Proxyquire或import的文件路径要和实际项目中的路径一致,避免找不到模块。

内容的提问来源于stack exchange,提问作者Justin Beall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:30:36