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

Redux Saga测试报错:期望mock函数却收到生成器函数原型

解决Redux Saga生成器测试的断言不匹配问题

问题根源

你遇到的错误来自两个核心问题:

  1. 调用方式不匹配:如果你的rootSaga里是yield all([testfunction()])(调用生成器函数返回迭代器),但测试里写的是all([testfunction])(传入函数本身),两边内容自然不匹配。
  2. 引用比较失效:all()每次调用都会生成全新的effect对象,用toBe(引用比较)必然失败,需要改用结构比较。

解决方法

方法1:用官方推荐的expectSaga工具(更简洁可靠)

Redux Saga Test Plan提供的expectSaga可以直接测试saga行为,无需手动迭代生成器:

import { expectSaga } from 'redux-saga-test-plan';
import { rootSaga } from './your-saga-file';
import { testfunction } from './your-testfunction-file';

// 模拟生成器类型的testfunction
jest.mock('./your-testfunction-file', () => ({
  testfunction: jest.fn(function*() {})
}));

test('rootSaga执行testfunction', () => {
  return expectSaga(rootSaga)
    .call(testfunction) // 断言testfunction被调用
    .run();
});

方法2:手动迭代生成器并正确断言

如果坚持手动测试,需要修正两个关键点:

  • 确保测试里的all参数和rootSaga里的调用完全一致
  • 用toEqual比较effect的结构,而非toBe比较引用
import { all } from 'redux-saga/effects';
import { rootSaga } from './your-saga-file';
import { testfunction } from './your-testfunction-file';

// 模拟生成器类型的testfunction
jest.mock('./your-testfunction-file', () => ({
  testfunction: jest.fn(function*() {})
}));

test('rootSaga正确yield包含testfunction的all effect', () => {
  const generator = rootSaga();
  // 注意:如果rootSaga里是testfunction(),这里必须加括号
  const expectedEffect = all([testfunction()]);
  
  // 用toEqual比较effect的结构,而非引用
  expect(generator.next().value).toEqual(expectedEffect);
});

额外注意点

如果testfunction是生成器函数,mock时必须模拟为生成器(用function*()语法),否则调用testfunction()返回的不是迭代器,依然会导致结构不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:12:44