首页 > 解决方案 > 开玩笑测试 - 如何处理 JsonWebToken 响应

问题描述

我正在学习如何测试我的 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 在做什么。

标签: reactjsreduxjestjsredux-thunkjest-fetch-mock

解决方案


我用自己的令牌“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);
      });
  });
});

推荐阅读