在redux应用程序中测试redux失败操作的最佳方法

时间:2016-08-04 20:16:04

标签: reactjs redux

假设我有一个如下所示的redux连接反应组件:

class App extends Component {
  renderErrorMessage() {
    const { errorMessage } = this.props;

    if(!errorMessage) {
      return;
    }

    // render error message
  }

  render() {
    return (
        <div>
          <Menu location={this.props.location.pathname}/>
          <div className="jumbotron">
            { this.renderErrorMessage() }
            { this.props.children }
          </div>
        </div>
    );
  }
};

function mapStateToProps(state) {
  return {
    errorMessage: state.get('errorMessage')
  };
};

App.propTypes = {
  errorMessage: PropTypes.string,
  children: PropTypes.node,
  resetErrorMessage: PropTypes.func.isRequired
};

export default connect(mapStateToProps, {
  resetErrorMessage
})(App);

我的失败行动如下:

export function fetchResultsFailure(error) {
  return {
    type: FETCH_RESULTS_FAILURE,
    error
  }
}

我的减速机看起来像这样:

function errorMessage(state = null, action) {
  const { type, error } = action;

  if(type === ActionTypes.RESET_ERROR_MESSAGE) {
    return null;
  } else if (error) {
    return action.error;
  }

  return state;
};

我正在使用redux-saga,故障情况可能会这样调用:

function* fetchEntity(entity, apiFn) {
  yield put(entity.request());
  const { response, error } = yield call(apiFn);

  if(response) {
    yield put(entity.success(response));
  } else {
    console.log(error);
    yield put(entity.failure(error));
  }

};

我该如何测试?我想测试这个结束,并返回错误消息

1 个答案:

答案 0 :(得分:0)

首先,您必须单元测试各个组件。例如。确保如果您将组件传递给错误道具,则会渲染它。

其次,端到端测试是关于测试整个应用。因此,为了测试错误在端到端测试中是否有效,您需要找出导致该错误的原因(例如数据库已关闭)并复制该错误(拔掉数据库服务器:))。

您可以存根/模拟各种接口(例如拦截强制错误的网络请求)并加快测试速度。

对于所有这些,您可能希望使用类似selenium的内容进行自动化。

最后,我的观点是,您不需要对不符合代码的内容进行单元测试。也就是说,您不需要测试Redux的connect是否按照它所说的那样进行测试,您不需要测试您的组件是否导入了正确的模块等。可能听起来很明显但我认为一旦你不再考虑多模块单元测试,你的测试就会越容易。