Sinon中uploadStub.callsArg(2).returns({})在Jest中的等效写法?
Jest 替代 Sinon
callsArg(2).returns({}) 的写法 基础等效实现
要完全对应 Sinon 中 uploadStub.callsArg(2).returns({}) 的行为(调用第三个参数的回调,同时存根函数本身返回空对象),Jest 可以这样写:
// 创建 Upload 的存根 const uploadStub = jest.fn((req, res, callback) => { // 调用传入的第三个参数(异步回调) callback(); // 对应 Sinon 的 returns({}),让存根返回空对象 return {}; });
如果需要给回调传参(比如模拟无错误的成功场景),可以修改为:
const uploadStub = jest.fn((req, res, callback) => { // 传入 error 为 null,模拟成功回调 callback(null); return {}; });
生成 Mock 回调并断言
如果需要将第三个参数的回调设为 Jest Mock 函数,方便后续断言调用情况(比如是否被调用、传入参数等),按以下步骤操作:
- 定义 Mock 回调函数:
// 创建 Jest Mock 回调,可自定义返回值或逻辑 const mockCallback = jest.fn(async () => { return 'mock return value'; });
- 调用 Upload 时传入这个 Mock 回调:
// 调用被存根的 Upload,传入 req、res 和 Mock 回调 uploadStub(req, res, mockCallback);
- 断言回调的调用情况:
// 断言回调被调用过一次 expect(mockCallback).toHaveBeenCalledTimes(1); // 断言回调被传入了预期参数(比如 error 为 null) expect(mockCallback).toHaveBeenCalledWith(null); // 断言异步回调的返回结果 expect(await mockCallback()).toBe('mock return value');
异步回调的处理
因为原回调是 async function,如果需要等待回调执行完成,将存根改为异步函数即可:
const uploadStub = jest.fn(async (req, res, callback) => { // 等待异步回调执行完成 await callback(null); return {}; });
内容的提问来源于stack exchange,提问作者Paul Solecki
相关产品推荐
相关产品推荐

