我正在学习如何测试我的 redux thunk 操作,我的登录响应包括一个随机的 JsonWebToken。我编写了一个名为expectedActions
的变量,它匹配从操作返回的所有数据,但如何处理随机字符串 (JWT( 除外。关于如何处理这个问题的任何想法?
-- 另外,我需要传递真实的用户信息(用户名/密码(以获得LOGIN_SUCCESS
响应,否则函数会调度LOGIN_FAIL
操作。这正常吗?
/* eslint-disable no-undef */
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import fetchMock from 'fetch-mock';
import * as actions from '../../../redux/actions/auth';
const middleware = [thunk];
const mockStore = configureMockStore(middleware);
describe('redux async actions', () => {
afterEach(() => {
fetchMock.reset();
fetchMock.restore();
});
it('returns expected login response', async () => {
const userData = {
username: 'user',
email: 'user@gmail.com',
password: 'password',
};
const config = {
headers: {
'Content-Type': 'application/json',
},
};
fetchMock.getOnce('http://localhost:5000/api/v1/users', {
body: { ...userData },
config,
});
const expectedActions = { payload: { token: '' }, type: 'LOGIN_SUCCESS' };
// the value of the token above in the response is a randomized jwt string
const store = mockStore({});
return store
.dispatch(actions.login('user@gmail.com', 'password'))
.then(() => {
// return of async actions
const actionsResponse = store.getActions();
expect(actionsResponse[0]).toEqual(expectedActions);
});
});
});
奖励:fetchMock
的意义何在?我从另一个 StackOverflow 问题中借用了上面的代码,但我还没有理解 fetchMock 在做什么。
我用我自己的标记"123"覆盖了响应 JWT。我不知道这是否正确,我也从不期望对这篇文章做出回应。
const middleware = [thunk];
const mockStore = configureMockStore(middleware);
describe('redux async actions', () => {
afterEach(() => {
fetchMock.reset();
fetchMock.restore();
});
it('returns expected login response', async () => {
const expectedActions = {
payload: { token: '123' },
type: 'LOGIN_SUCCESS',
};
const store = mockStore({ alert: [], auth: { token: '123' } });
return store
.dispatch(actions.login('user@gmail.com', 'somePassword'))
.then(() => {
// return of async actions
const actionsResponse = store.getActions();
actionsResponse[0].payload.token = '123';
expect(actionsResponse[0]).toEqual(expectedActions);
});
});
});