【发布时间】:2019-05-07 18:42:35
【问题描述】:
我创建了一个 recordSaga 函数,它的目标是记录在 saga 期间调度了哪些动作。
export const recordSaga = async (saga, initialAction, state) => {
const dispatched = [];
const done = await runSaga(
{
dispatch: action => dispatched.push(action),
getState: () => state,
},
saga,
initialAction,
).done;
return {
dispatched,
done,
};
};
假设我的传奇是这个
export function* mySaga() {
const needToSave = yield select(needToSaveDocument);
if (needToSave) {
yield put(saveDocument());
yield take(SAVE_DOCUMENT_SUCCESS);
}
yield put(doSomethingElse())
}
我想写两个测试,我希望是下面的
describe('mySaga', async () => {
it('test 1: no need to save', async () => {
const state = { needToSave: false }
const { dispatched } = await recordSaga(mySaga, {}, state);
expect(dispatched).toEqual([
doSomethingElse()
])
})
it('test 2: need to save', async () => {
const state = { needToSave: true }
const { dispatched } = await recordSaga(mySaga, {}, state);
expect(dispatched).toEqual([
saveDocument(),
doSomethingElse()
])
})
})
但是,对于测试 2,中间有一个 take,当然还有 jest(或其女友 jasmine)对我大喊大叫:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
我知道这是因为 runSaga 正在等待 take(SAVE_DOCUMENT_SUCCESS),但我该如何模拟呢?
【问题讨论】:
标签: testing jasmine mocking jestjs redux-saga