Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在React Saga单元测试中需要帮助吗_Javascript_Reactjs_Unit Testing_Jestjs_Redux Saga - Fatal编程技术网

Javascript 在React Saga单元测试中需要帮助吗

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

我在测试我的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 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功能