Javascript 在React Saga单元测试中需要帮助吗
我在测试我的saga功能时面临isse:Javascript 在React Saga单元测试中需要帮助吗,javascript,reactjs,unit-testing,jestjs,redux-saga,Javascript,Reactjs,Unit Testing,Jestjs,Redux Saga,我在测试我的saga功能时面临isse: function * onSaveDATA() { try { yield put( showStatusMessage({ messageContent: 'Saving Your Data' })); const body = yield select( state => state.appData.userDetails ); yield call( postDATA, { body }); yield
function * onSaveDATA() {
try {
yield put( showStatusMessage({ messageContent: 'Saving Your Data' }));
const body = yield select( state => state.appData.userDetails );
yield call( postDATA, { body });
yield put( hideStatusMessage());
yield put({ type: ActionTypes.SAVE_DATA_OK });
} catch ( e ) {
yield put({ type: ActionTypes.CRITICAL_ERROR_OCCURED, payload: e });
}
}
export function * save_on_change( ) {
yield takeEvery( ActionTypes.SAVE_DATA_REQ, onSaveDATA );
}
这里有一个单元测试,我写它来测试这个函数,但是它没有通过测试。我不确定出了什么问题
import { runSaga } from 'redux-saga';
import { postDATA } from './../../../../services/my_service';
// import { openModalMessage } from './../../../../actions';
import { saveDATA } from './';
jest.mock( './../../../../services/my_service' );
jest.mock( './../../../../actions' );
describe( 'Saga: Save Data', () => {
test( 'saveDATA OK', async () => {
postDATA.mockReset();
postDATA.mockReturnValue( {s:'Somevalue'} );
const dispatchedActions = [];
await runSaga({
dispatch: action => dispatchedActions.push( action ),
getState: () => ({
appState: {},
appData: { userDetails: {name:'mock-name'}},
}),
}, save_on_change );
expect( postDATA ).toHaveBeenCalled();
});
});
当我运行这个时,它失败了。我不知道我错过了什么。是因为
saveDATA
函数正在使用工厂函数takeEvery吗。我是否需要明确触发“保存数据请求”操作?这是针对“redux saga”的单元测试解决方案“^1.1.3”
:
index.ts
:
import{put,select,call,takeEvery}来自'redux saga/effects';
从“./service”导入{postDATA};
导出常量操作类型={
SAVE_DATA_OK:“SAVE_DATA_OK”,
发生严重错误:“发生严重错误”,
保存数据请求:“保存数据请求”,
};
const showStatusMessage=(有效负载)=>({type:'SHOW_STATUS_MESSAGE',payload});
const hideStatusMessage=()=>({type:'HIDE_STATUS_MESSAGE'});
导出函数*onSaveDATA(){
试一试{
产生put(showStatusMessage({messageContent:'保存数据'}));
const body=yield select((state)=>state.appData.userDetails);
产生调用(postDATA,{body});
收益率put(hideStatusMessage());
产生put({type:ActionTypes.SAVE_DATA_OK});
}捕获(e){
产生put({type:ActionTypes.CRITICAL\发生错误,有效负载:e});
}
}
导出函数*保存更改(){
收益率(ActionTypes.SAVE_DATA_REQ、onSaveDATA);
}
service.ts
:
导出异步函数postDATA(数据){
返回{s:'真实数据'};
}
index.test.ts
:
从'redux saga'导入{runSaga};
从“/”导入{onSaveDATA,ActionTypes,save_on_change};
从“./service”导入{postDATA};
从'ts jest/utils'导入{mocked};
从“redux saga/effects”导入{takeEvery};
开玩笑的模仿(“/服务”);
描述('62952662',()=>{
毕竟(()=>{
jest.resetAllMocks();
});
描述('onSaveDATA',()=>{
测试('应保存数据',异步()=>{
mocked(postDATA).mockResolvedValueOnce({s:'Somevalue'});
const dispatchedActions:任意[]=[];
等待runSaga(
{
调度:(操作)=>dispatchedActions.push(操作),
getState:()=>({
appState:{},
appData:{userDetails:{name:'mock name'}},
}),
},
onSaveDATA,
).toPromise();
expect(postDATA).toBeCalledWith({body:{name:'mock name'}});
期望(调度动作)。toEqual([
{type:'SHOW_STATUS_MESSAGE',负载:{messageContent:'Saving Your Data'},
{键入:'隐藏\状态\消息'},
{type:ActionTypes.SAVE_DATA_OK},
]);
});
test('postDATA错误时应处理错误',async()=>{
const mError=新错误(“网络”);
mocked(postDATA).mockRejectedValueOnce(mError);
const dispatchedActions:任意[]=[];
等待runSaga(
{
调度:(操作)=>dispatchedActions.push(操作),
getState:()=>({
appState:{},
appData:{userDetails:{name:'mock name'}},
}),
},
onSaveDATA,
).toPromise();
expect(postDATA).toBeCalledWith({body:{name:'mock name'}});
期望(调度动作)。toEqual([
{type:'SHOW_STATUS_MESSAGE',负载:{messageContent:'Saving Your Data'},
{type:ActionTypes.CRITICAL\发生错误,有效负载:mError},
]);
});
});
描述('save_on_change',()=>{
测试('应该等待每个SAVE_DATA_REQ操作并调用savedata',()=>{
const gen=在更改时保存更改();
expect(gen.next().value).toEqual(takeEvery(ActionTypes.SAVE_DATA_REQ,onSaveDATA));
expect(gen.next().done).toBeTruthy();
});
});
});
单元测试结果和覆盖率报告:
通过src/stackoverflow/62952662/index.test.ts
62952662
onSaveDATA
✓ 应保存数据(6毫秒)
✓ 如果postDATA错误(2毫秒),则应处理错误
在更改时保存
✓ 应等待每个SAVE_DATA_REQ操作并调用SaveData(1毫秒)
------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
------------|---------|----------|---------|---------|-------------------
所有文件| 95 | 100 | 83.33 | 93.75 |
index.ts | 100 | 100 | 100 | 100 |
service.ts | 50 | 100 | 0 | 50 | 2
------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:3次通过,共3次
快照:共0个
时间:2.928秒,估计3秒
我没有导出onSaveDATA,它在发送操作SAVE\u DATA\u REQ时被调用。使用takeEvery on save_on_change功能