【发布时间】:2019-12-05 02:53:17
【问题描述】:
我是 Jest 的新手,我正在尝试对我的异步操作创建者进行测试。问题是我只看到了测试示例,其中有一个用于操作创建者的方法和其他用于调度的单独方法。我的动作创建者将调度作为异步回调函数,但我不知道如何进行测试。 我的 Action Reducer 如下所示:
export const postConnection = (connectionUrl, username, password) => {
return async (dispatch) => {
const response = await requireAuthActions.post('/db/conexion', JSON.stringify({ connectionUrl, username, password }));
dispatch({ type: POST_CONNECTION, payload: response.data });
history.push('/conexiones');
}
}
我试图做测试脚本,但是当我运行它时它会抛出一个错误。脚本如下所示:
describe('Pruebas de Conexiones', () => {
describe('Action Creators', () => {
it("Crear conexión", async () => {
const dispatch = jest.fn();
const {data} = await postConnection('www.google.com', 'root', 'password')(dispatch);
dispatch({});
});
});
});
当我尝试运行测试脚本时,它会抛出下一个错误:
Request failed with status code 401
at createError (node_modules/axios/lib/core/createError.js:16:15)
at settle (node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (node_modules/axios/lib/adapters/http.js:237:11)
有没有办法测试像我这样的操作创建者?
编辑 现在我有一个模拟 axios 的模拟文件,看起来像这样:
const mockAxios = jest.genMockFromModule('axios');
mockAxios.create = jest.fn(() => mockAxios)
export default mockAxios
但现在我的问题是我不知道如何在测试文件中实现这一点。现在我有这样的东西:
import thunk from 'redux-thunk';
import mockAxios from 'axios';
const middlewares = [thunk];
const mockStore = configureStore(middlewares);
describe('Test de conexiones', () =>{
describe('Action Creators', () =>{
it('Agregar conexión', async () =>{
const store = mockStore({});
const mockData = {data:123};
mockAxios.get.mockImplementationOnce(()=>Promise.resolve({data: mockData}));
const expectedActions = [
{type: POST_CONNECTION, data: mockData}
]
const dispatch = jest.fn();
const response = await postConnection('www.google.com','root','password')(dispatch);
});
});
});
它会抛出下一个错误:
TypeError: Cannot read property 'data' of undefined
12 | return async (dispatch) => {
13 | const response = await requireAuthActions.post('/db/conexion', JSON.stringify({ connectionUrl, username, password }));
> 14 | dispatch({ type: POST_CONNECTION, payload: response.data });
| ^
15 | history.push('/conexiones');
16 | }
17 | }
【问题讨论】:
-
您遇到的错误是什么?您是否尝试过使用您的
jest.fn()作为测试间谍?通常,您的测试不应调用外部服务,因此您也需要模拟该响应,忘记整个 async/await 方法。 -
@jmargolisvt 我已经用错误日志更新了我的问题。
-
您没有模拟您的 API,因此它调用了具有不完整数据的真实服务器。更好地模拟它。
-
@jmargolisvt 是这样的吗?
expect(dispatch.mock.calls).toEqual(data);
标签: javascript redux jestjs