reactjs - 测试使用 Redux Thunk 和身份验证的 redux 操作
问题描述
我对测试 React-Redux 还是很陌生,我想测试我的 loadUser-action,它使用 redux-thunk 并调用具有身份验证中间件的端点。这是我想测试的代码:
export const loadUser = () => (dispatch, getState) => {
dispatch({ type: USER_LOADING });
axios
.get('/auth/user', tokenConfig(getState))
.then((res) =>
dispatch({
type: USER_LOADED,
payload: res.data,
})
)
.catch((err) => {
console.log(err);
dispatch({
type: LOADING_FAILURE,
});
});
};
export const tokenConfig = (getState) => {
const token = getState().auth.token;
const config = {
headers: {
'Content-type': 'application/json',
},
};
if (token) {
config.headers['x-auth-token'] = token;
}
console.log('CONFIG', config);
return config;
};
这是我到目前为止的测试:
import { mockStore } from '../../test/utils/mockStore';
import { USER_LOADED } from '../types/authTypes';
import { loadUser } from './authActions';
describe('loadUser', () => {
fit('gets user', async () => {
const store = mockStore();
const tokenConfig = jest.fn();
await store.dispatch(loadUser());
const actions = store.getActions();
expect(actions[0]).toEqual({ type: USER_LOADED, meta: {} });
});
});
tokenConfig 函数必须以不同的方式调用。我不知道怎么做!
解决方案
我会嘲笑axios
,因为您不想在运行单元测试时进行实际的 API 调用,因为它会使用您服务器上的资源。同样通过模拟 axios,您不必模拟tokenConfig
.
这就是我在我的个人项目中所做的:
import { mockStore } from '../../test/utils/mockStore';
import { USER_LOADED, LOADING_FAILURE } from '../types/authTypes';
import { loadUser } from './authActions';
import axios from 'axios';
jest.mock('axios'); // mock axios library
describe('loadUser', () => {
fit('gets user', async () => {
const store = mockStore();
axios.get.mockImplementationOnce(() => Promise.resolve({ data: {} })); // mock resolve success
await store.dispatch(loadUser());
const actions = store.getActions();
expect(actions[0]).toEqual({ type: USER_LOADED, payload: {} });
});
it('handles api failure', () => {
const store = mockStore();
axios.get.mockImplementationOnce(() => Promise.reject('Error')); // mock error
await store.dispatch(loadUser());
const actions = store.getActions();
expect(actions[0]).toEqual({ type: LOADING_FAILURE });
});
});
推荐阅读
- java - @Resource Injection 突然停止工作
- javascript - Mongoose:使用钩子/中间件删除引用的对象(有很多)
- c# - ASP.NET Core 2.1 路由 - CreatedAtRoute - 没有路由与提供的值匹配
- javascript - 使用 JavaScript 的 ASP/ASPX 标签可见性
- sql - 负载平衡 - ASP.NET SessionID 的问题
- python - Python程序采用两个整数输入来查找偶数和奇数
- python - Pandas:将一个数据帧的特定列连接到另一个数据帧
- c# - C# Activator.CreateInstance 错误,MissingMethodException:System.MissingMethodException:没有为此对象定义无参数构造函数
- countdowntimer - 如何在 Phaser 游戏中添加倒数计时器
- sas - sas读取以空格为分隔符的文件