arn*_*bro 5 testing mocking jasmine jestjs redux-saga
我创建了一个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,
};
};
Run Code Online (Sandbox Code Playgroud)
所以让我们说我的传奇就是这个
export function* mySaga() {
const needToSave = yield select(needToSaveDocument);
if (needToSave) {
yield put(saveDocument());
yield take(SAVE_DOCUMENT_SUCCESS);
}
yield put(doSomethingElse())
}
Run Code Online (Sandbox Code Playgroud)
我想写两个测试,我希望它们如下
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()
])
})
})
Run Code Online (Sandbox Code Playgroud)
然而,对于take中间有一个的测试 2,当然jest(或它的女朋友jasmine)对我大喊大叫:Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
我知道这是因为runSaga正在等待take(SAVE_DOCUMENT_SUCCESS),但我怎么能模拟呢?
通过查看recordSaga:
export const recordSaga = async (saga, initialAction, state) => {
Run Code Online (Sandbox Code Playgroud)
看来你应该{type: SAVE_DOCUMENT_SUCCESS}作为第二个参数传递(即initialAction)。这应该会触发take效果。
| 归档时间: |
|
| 查看次数: |
1192 次 |
| 最近记录: |