如何用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
相关产品推荐
相关产品推荐

