【问题标题】:React redux async action creator testReact redux 异步动作创建者测试
【发布时间】:2018-12-21 10:23:03
【问题描述】:

我是 react redux 的新手。我正在尝试测试异步操作

动作看起来像 >

export function fetchUserJd() {
  return (dispatch) => {
    let url = FETCH_JD_ROOT_URL + page + "&" + size;
    dispatch({
      type: REQUEST_INITIATED
    })
    get(url)
      .then((response) => {
        if (response.status === 200) {
          dispatch({
            type: REQUEST_SUCCESSED,
          });
          dispatch({
            type: FETCHING_JOBDESCRIPTION_SUCCESS,
            data: response.payload,
          }
          )
        }
        else {
          dispatch({
            type: REQUEST_SUCCESSED
          })
          toastr.error("Error while fetching Job Description, Please check again");
          if (response.status === "") {
            toastr.error('Our server is down. Please check again');
          }
          dispatch({
            type: FETCHING_JOBDESCRIPTION_FAILED,
            data: response.status,
          });
          if (response.status === 401) {
            toastr.error('Please Login Again');
            localStorage.clear();
            history.push('/');
          }
        }
      })
  }

现在我正在尝试像这样测试它,

describe('Header component actions', () => {

    beforeEach(() => moxios.install());
     afterEach(() => moxios.uninstall());

    it('creates Fetch Jopb description when login action is successful', async (done) => {
        let url = FETCH_JD_ROOT_URL + page + "&" + size;
    moxios.stubRequest(url, {
      status: 201,
      response: mockData.jobDescriptionResponse
    });
    const expectedActions = [{ type: "FETCHING_JOBDESCRIPTION_SUCCESS"}];
    const store = mockStore({});
    await store.dispatch(fetchUserJd())
      .then(() => {
        expect(store.getActions()).toEqual(expectedActions);
      });
    done();
  });
});

所以我在这里遇到一个错误,

超时 - 在指定的超时时间内未调用异步回调 jasmine.DEFAULT_TIMEOUT_INTERVAL。

所以,我没有收到此错误,有人可以帮助我吗? 而且我写测试用例的方式对吗?

要请求我也使用令牌,

headers: {
                "Authorization": localStorage.getItem("access_token") !== null ? `Bearer ` + localStorage.getItem("access_token") : null,
                "Content-Type": "application/json"
            }

我的呼叫服务是这样的,

export const get = (url) =>
    axios.get(
        url,
        {
            headers: {
                "Authorization": localStorage.getItem("access_token") !== null ? `Bearer ` + localStorage.getItem("access_token") : null,
                "Content-Type": "application/json"
            }
        }
    ).then(data => {
        if (data.status === HttpStatus.OK) {
            return {
                status: data.status,
                payload: data.data
            };
        }
    }).catch(err => {
        return {
            status: err.response.data,
            payload: null
        };
    });

那么,是不是因为我没有传递令牌?

【问题讨论】:

  • 您忘记在动作创建者中将您的电话回电到get
  • 能否请您在回答中更新一下

标签: reactjs redux react-redux jestjs


【解决方案1】:

您忘记从动作创建者返回Promise:您必须返回get 调用,它应该可以工作:

export function fetchUserJd() {
  return (dispatch) => {
    let url = FETCH_JD_ROOT_URL + page + "&" + size;
    dispatch({
      type: REQUEST_INITIATED
    })
    return get(url) // you missed the return statement here
      .then((response) => {
        if (response.status === 200) {
          dispatch({
            type: REQUEST_SUCCESSED,
          });
          dispatch({
            type: FETCHING_JOBDESCRIPTION_SUCCESS,
            data: response.payload,
          }
          )
        }
        else {
          dispatch({
            type: REQUEST_SUCCESSED
          })
          toastr.error("Error while fetching Job Description, Please check again");
          if (response.status === "") {
            toastr.error('Our server is down. Please check again');
          }
          dispatch({
            type: FETCHING_JOBDESCRIPTION_FAILED,
            data: response.status,
          });
          if (response.status === 401) {
            toastr.error('Please Login Again');
            localStorage.clear();
            history.push('/');
          }
        }
      })
  }

【讨论】:

  • 我在您错过return 语句的地方添加了代码。
  • 嘿,即使没有这个,我的代码也可以正常工作。只有在测试用例中使用它时才会发生这种情况
  • 是的,我知道您的代码可以工作,但是您的测试中 awaitstore.dispatch 的结果,您需要返回 get 调用返回的 promise。没有它,您的代码将无限期等待,从而达到timeout
  • 我用过这个,但它仍然给我同样的错误。
  • 嘿,我什么都试过了,但还是不行。我已经更新了 get 方法的代码,请您检查一下
猜你喜欢
  • 2018-04-27
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多