使用 Redux Thunk 和 Axios 测试 Action Creator

Posted

技术标签:

【中文标题】使用 Redux Thunk 和 Axios 测试 Action Creator【英文标题】:Testing Action Creator with Redux Thunk & Axios 【发布时间】:2018-09-27 16:11:54 【问题描述】:

我有一个 redux-thunk 动作创建器,它通过 axios 发出 API 请求,然后该请求的结果决定将哪种动作分派给我的 reducer(AUTH 或 UNAUTH)。

这很好用,但我不确定测试此功能的正确方法是什么。我已经找到了下面的解决方案,但在我的测试中出现以下错误:

1) AUTH ACTION
   returns a token on success:
     TypeError: Cannot read property 'then' of undefined

现在这个错误让我相信我真正从我的动作创建者那里得到的不是一个承诺,但我真的在努力寻找前进的道路。

src/actions/index.js

import axios from "axios";

import  AUTH_USER  from "./types";

const ROOT_URL = "http://localhost:";
const PORT = "3030";

export function signinUser( email, password ) 
  return ((dispatch) => 
    axios
      .post(`$ROOT_URL$PORT/signin`,  email, password )
      .then(response => 
        // update state to be auth'd
        dispatch( type: AUTH_USER );
        // Save token locally
        localStorage.setItem('token', response.data.token)
      )
      .catch(error => 
        dispatch( type: AUTH_ERROR, payload: error );
      );
  );

test/actions/index_test.js

import  expect  from "../test_helper";
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import moxios from 'moxios';

import  AUTH_USER  from "../../src/actions/types";

import  signinUser  from "../../src/actions/index";

const middleware = [thunk];
const mockStore = configureMockStore(middleware);
let store;
let url;

describe('AUTH ACTION', () => 
  beforeEach(() => 
    moxios.install();
    store = mockStore();
    url = "http://localhost:3030";
  );
  afterEach(() => 
    moxios.uninstall();
  );

  it('returns a token on success', (done) => 
    moxios.stubRequest(url, 
      status: 200,
      response: 
        data: 
          token: 'sample_token'
        
      ,
    );

    const expectedAction =  type: AUTH_USER 

    let testData =  email: "test1@test.com", password: "1234"
    store.dispatch(signinUser(testData)).then(() => 
      const actualAction = store.getActions()
      expect(actualAction).to.eql(expectedAction)
    )
  )
)

任何帮助或见解将不胜感激。

【问题讨论】:

【参考方案1】:

store.dispatch(someThunk()).then() 仅在 thunk 返回承诺时有效,而您的 thunk 实际上并未返回承诺。

如果你只是在axios() 前面加上一个return,它应该工作。

【讨论】:

非常感谢!

以上是关于使用 Redux Thunk 和 Axios 测试 Action Creator的主要内容,如果未能解决你的问题,请参考以下文章

React + redux + axios + thunk,等待interceptors.response 刷新token

使用 Redux、Thunk、Axios 创建多部分表单组件

Redux Thunk操作,axios返回多个值

如何使用 redux-axios-middleware 测试 Redux 异步操作

带有 axios 返回多个值的 Redux Thunk 操作

使用 axios 的 redux-thunk 的通用数据加载器