Redux Saga测试报错:期望mock函数却收到生成器函数原型
解决Redux Saga生成器测试的断言不匹配问题
问题根源
你遇到的错误来自两个核心问题:
- 调用方式不匹配:如果你的
rootSaga里是yield all([testfunction()])(调用生成器函数返回迭代器),但测试里写的是all([testfunction])(传入函数本身),两边内容自然不匹配。 - 引用比较失效:
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
相关产品推荐
相关产品推荐

