【问题标题】:How to test Redux action creators如何测试 Redux 动作创建者
【发布时间】:2020-05-20 15:47:24
【问题描述】:

我有一个动作创建者,我应该如何用 jest 测试它? 问题是,我什至无法进入 Api 函数,这就是为什么我无法获得 LOGIN_SUCCESS, 当我检查 store.getState() 它只给我 LOGIN_REQUEST 和 LOGIN_FAILURE

const authUser = (login, password) => async (dispatch) => {
  dispatch({
    type: actionTypes.LOGIN_REQUEST,
  });

  try {
    return await Api('login', 'post', { login, password })
      .then((response) => {
        const { data } = response;
        if (data.error) {
          throw data;
        }
        const { value } = response.data;
        let encoded = [];
        encoded = JSON.parse(Base64.decode(value));
        dispatch({
          type: actionTypes.LOGIN_SUCCESS,
          payload: {
            encoded,
          },
        });
        return encoded;
      })
      .catch((error) => {
        throw error;
      });
  } catch (error) {
    dispatch({
      type: actionTypes.LOGOUT_FAILURE,
      payload: {
        error,
      },
    });
  }
};

api.js

axios.defaults.withCredentials = true;
const Api = (path, method, data) => {
  return axios({
    method,
    url: `${process.env.REACT_APP_URL}${path}`,
    headers: {
      Authorization: `Basic ${process.env.REACT_APP_SECRET_TOKEN}`,
      'Content-Type': 'application/json;charset=utf-8',
    },
    data,
  });
};

【问题讨论】:

    标签: reactjs redux jestjs axios


    【解决方案1】:

    您拥有的是不是action creator。它与副作用(即 api 调用)混合在一起。请考虑将其拆分为更小的部分,以便更简单、更简短地进行测试。

    回过头来,动作创建者只是生成动作的函数。

    像这样:

    const loginRequest = () => {
      type: "LOGIN_REQUEST",
      payload: {}
    };
    
    const loginSuccess = (encoded) => {
      type: "LOGIN_SUCCESS",
      payload: {
        encoded
      }
    };
    

    那么测试就很简单了:

    import { loginRequest, loginSuccess } from "./actions";
    
    it('creates a LOGIN_REQUEST action', () => {
      const expectedAction = {
        type: 'LOGIN_REQUEST',
      }
    
      expect(loginRequest()).toEqual(expectedAction);
    });
    
    it('creates a LOGIN_SUCCESS action', () => {
      const encoded = 'xxxx';
      const expectedAction = {
        type: 'LOGIN_SUCCESS',
        payload: {
          encoded
        }
      }
    
      expect(loginSuccess(encoded)).toEqual(expectedAction)
    });
    
    

    测试动作创建者的目标是确保生成的动作正确/符合预期。可以通过模拟或通过 Redux saga 生成器来测试 API 调用。

    【讨论】:

    • 哦,也许我花了太多时间,但我不知道如何更改我的代码并“简化它”我从登录页面调度的这段代码的主要目标,并允许用户身份验证与否,根据 api answer 我可以决定我应该做什么,如果你有一个 ofc,你能给我一些真实的例子
    • @Bravis,如果您决定添加中间件,可以查看async examplesredux saga testing
    • 好的,好的。但是你能告诉我我的 authUser.js 动作应该是什么样子吗,如果它太粗暴了?
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多