【发布时间】:2021-08-03 18:03:22
【问题描述】:
所以我正在尝试使用 runSaga 函数测试一个 redux saga。这个 saga 调用 API 并通过调用操作将其响应存储在状态中。存储后,我正在使用选择器检索存储的数据并执行一些操作。我能够模拟 API 响应并在 API 返回后调用成功操作。
当我在下一行尝试调用选择器从存储中获取数据时,它似乎是从存储中获取初始状态,而不是 API 成功后的更新状态。
这是我的代码:
// loadSaga.js. This is the saga that I'm testing
export function* loadSaga(request) {
const endpoint = yield select(ListEndpointSelector);
const listResponse = yield call(request, endpoint, 'GET', {}, throwIfNot404);
console.log(listResponse); // Returns the correct mocked API response
yield put(loadListSuccess(listResponse));
const { list as newList } = yield select(listSelector);
console.log(newList); // Returns empty array
// ... do something with newList but newList is empty
};
// loadSaga.test.js
import { runSaga } from 'redux-saga';
import * as reduxSagaEffects from 'redux-saga/effects';
const mockState = {
user: {
list: [],
},
},
};
describe('loadSaga', () => {
it('returns the correct list of users', async () => {
const dispatchedActions = [];
const mockUsers = [
{
id: 1,
name: 'abc',
},
{
id: 2,
name: 'xyz',
},
]
const mockfn = jest.fn().mockImplementationOnce(() => mockUsers);
// eslint-disable-next-line
const m = jest.mock('redux-saga/effects', () => ({
...reduxSagaEffects,
call: mockfn,
}));
const { loadSaga } = require('./loadSaga.js');
runSaga({
dispatch: (action) => dispatchedActions.push(action),
getState: () => (mockState),
}, loadSaga);
console.log(dispatchedActions);
});
当我控制台 listResponse 时,我从我在 mockFn 中设置的 API 获得了正确的 mockedResponse。但是当我控制台newList 时,它返回[] 这似乎是mockState 中设置的列表。
已调度操作的 console.log 显示正在调度的正确操作,甚至是 loadListSuccess 以及传递给它的模拟 API 响应。
由于yield select(listSelector) 没有返回正确的输出,我无法测试进一步的测试用例。我应该更改哪些内容才能在选择器中检索当前更新的状态?
【问题讨论】:
标签: reactjs unit-testing redux jestjs redux-saga