Я использую шаблон тестирования recordSaga для проверки моих саг:
recordSaga.js
import { runSaga } from "redux-saga";
export default async function recordSaga(saga, initialAction) {
const dispatched = [];
await runSaga(
{
dispatch: action => {
dispatched.push(action);
console.log(dispatched);
}
},
saga,
initialAction
).done;
console.log(dispatched);
return dispatched;
}
dealAction.test.js
describe("getDealsSaga", () => {
it("dispatches a success action with the fetched deals", async () => {
const dispatched = await recordSaga(getDealsSaga, startAction);
console.log(dispatched);
expect(dispatched).toContainEqual(successAction);
});
});
dealActions.js
export function* getDealsSaga(): Saga<void> {
try {
const rawDeals: Object[] = yield call(getDealsApi);
const deals: Deal[] = rawDeals.map(p => Deal.fromApi(p));
console.log("getDealsSaga", deals.length, "deals");
yield put({ type: "GET_DEALS_SUCCESS", deals });
} catch (error) {
console.log("getDealsSaga", "error:", error);
yield put({ type: "GET_DEALS_FAILURE", error });
}
}
export default function* dealSaga(): Saga<void> {
yield all([yield takeEvery("GET_DEALS_START", getDealsSaga)]);
}
Тест не пройден, получен пустой массив.Тем не менее, операторы журнала внутри саги , а также внутри recordSaga
подтверждают, что сага работает, а обратный вызов внутри recordSaga
работает.
console.log recordSaga.js:15
[]
console.log __tests__/dealActions.test.js:46
[]
console.log src/redux/actions/dealActions.js:27
getDealsSaga 10 deals
console.log recordSaga.js:9
[ { type: 'GET_DEALS_SUCCESS',
deals:
[ [Deal],
[Deal],
[Deal],
[Deal],
[Deal],
[Deal],
[Deal],
[Deal],
[Deal],
[Deal] ] } ]
Порядокжурналы подразумевают, что что-то не так с асинхронностью в recordSaga
или в тестах.
Я очень смущен, потому что я использовал этот шаблон с этим точным кодом - тот же файл recordSaga
, saga / actions / tests, которые идентичны, за исключением их данных, - в нескольких других проектах, и яУ меня никогда не было этой проблемы.