当前位置: 首页 > 面试题库 >

如何对异步Redux动作进行单元测试以模拟Ajax响应

公羊新
2023-03-14
问题内容

我正在创建一个用于使用异步操作发出Ajax请求的中间件。中间件截取原始动作,执行ajax请求,并dispatch恢复原始动作以及来自的响应url

所以,我的组件只会是这样dispatch的动作

onClick() {
    dispatch(ActionCreator.fetchUser());
}

其余部分将通过中间件如图所示照顾这里。

我的问题是,单元测试应该怎么做?我应该嘲笑onClick自己吗?还是应该编写一个模拟的中间件并通过模拟的响应转发操作?

我不确定应该采用哪种方法。我尝试了几种方法,但是我尝试的所有方法都不有意义。

有指针吗?


问题答案:

注意:以下答案有些过时。

这里描述了一种更简单的更新方法。
不过,您仍然可以用其他方式进行操作。

现在,我们在官方文档中提供了有关测试异步操作创建者的部分。

对于使用Redux Thunk或其他中间件的异步动作创建者,最好完全模拟Reduxhtml" target="_blank">存储以进行测试。您仍然可以使用applyMiddleware()模拟存储,如下所示。您还可以使用nock模拟HTTP请求。

function fetchTodosRequest() {
  return {
    type: ADD_TODOS_REQUEST
  };
}

function fetchTodosSuccess(body) {
  return {
    type: ADD_TODOS_SUCCESS,
    body
  };
}

function fetchTodosFailure(ex) {
  return {
    type: ADD_TODOS_FAILURE,
    ex
  };
}

export function fetchTodos(data) {
  return dispatch => {
    dispatch(fetchTodosRequest());
    return fetch('http://example.com/todos')
      .then(res => res.json())
      .then(json => dispatch(addTodosSuccess(json.body)))
      .catch(ex => dispatch(addTodosFailure(ex)));
  };
}

可以像这样进行测试:

import expect from 'expect';
import { applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import * as actions from '../../actions/counter';
import * as types from '../../constants/ActionTypes';
import nock from 'nock';

const middlewares = [thunk];

/**
 * Creates a mock of Redux store with middleware.
 */
function mockStore(getState, expectedActions, onLastAction) {
  if (!Array.isArray(expectedActions)) {
    throw new Error('expectedActions should be an array of expected actions.');
  }
  if (typeof onLastAction !== 'undefined' && typeof onLastAction !== 'function') {
    throw new Error('onLastAction should either be undefined or function.');
  }

  function mockStoreWithoutMiddleware() {
    return {
      getState() {
        return typeof getState === 'function' ?
          getState() :
          getState;
      },

      dispatch(action) {
        const expectedAction = expectedActions.shift();
        expect(action).toEqual(expectedAction);
        if (onLastAction && !expectedActions.length) {
          onLastAction();
        }
        return action;
      }
    }
  }

  const mockStoreWithMiddleware = applyMiddleware(
    ...middlewares
  )(mockStoreWithoutMiddleware);

  return mockStoreWithMiddleware();
}

describe('async actions', () => {
  afterEach(() => {
    nock.cleanAll();
  });

  it('creates FETCH_TODO_SUCCESS when fetching todos has been done', (done) => {
    nock('http://example.com/')
      .get('/todos')
      .reply(200, { todos: ['do something'] });

    const expectedActions = [
      { type: types.FETCH_TODO_REQUEST },
      { type: types.FETCH_TODO_SUCCESS, body: { todos: ['do something']  } }
    ]
    const store = mockStore({ todos: [] }, expectedActions, done);
    store.dispatch(actions.fetchTodos());
  });
});


 类似资料:
  • 我有一个示例方法(我需要编写测试用例)如下所示, 我想模拟getConfig方法并返回一个特定的字符串值。getConfig是Kotlin对象中方法,如下所示, 下面是我尝试的测试 我没有得到任何错误,但是getConfig方法没有被嘲笑。执行实际的实现。我也试过使用Powermockito。请帮帮我

  • 问题内容: 如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段: 有人有好主意吗? 问题答案: 其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。 以您的代码为例。在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元

  • 问题内容: 我正在尝试为一些依赖WifiManager和返回的ScanResults的类实现一些单元测试。我想做的是能够控制我收到的ScanResults,以测试各种不同的条件。 不幸的是,对我来说,成功模拟WifiManager非常困难(尽管我想我可以在MockWifiManager中传递其构造函数null引用)。这只是我的第一个问题,因为一旦我有一个MockWifiManager可以玩(如果它

  • 问题内容: 我是Java和junit的新手。我有以下要测试的代码。如果您能提出有关测试它的最佳方法的想法,将不胜感激。 基本上,以下代码与从集群中选出领导者有关。领导者在共享缓存上持有锁,并且如果领导者以某种方式释放了对缓存的锁定,则领导者的服务将恢复并处置。 我如何确保领导者/线程仍保持对缓存的锁定,并且在执行第一个线程时另一个线程无法恢复其服务? 问题答案: 作为测试框架的替代方法(或使用JU

  • 我试图将单元测试框架(JEST)添加到用AMD编写的遗留JavaScript代码库中。当需要添加模块时,NodeJs会触发一个错误。 以下是JavaScript AMD: 以下是测试文件: 以下是错误: 测试套件无法运行 无法将模块分配给与当前文件不同的id● 测试套件无法运行

  • 我在单元测试(用C#编写)中存根了必要的方法等,但问题是在断言测试之前异步操作没有完成。 我怎么才能绕过这个?我应该创建一个模拟TaskFactory或任何其他技巧来单元测试异步操作吗?

  • 问题内容: 我正在使用Mocha,Chai,Karma,Sinn,Webpack进行单元测试。 我通过此链接为React-Redux Code配置了我的测试环境。 如何在React with Karma,Babel和Webpack上实现测试+代码覆盖率 我可以成功地测试动作和reducers的javascript代码,但是当涉及到测试我的组件时,它总是会抛出一些错误。 上面的代码出现了以下错误。

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样: