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

Redux:如何测试连接的组件?

拓拔弘厚
2023-03-14
问题内容

Enzyme用来对我的React组件进行单元测试。我知道,为了测试原始未连接的组件,我只需要导出它并对其进行测试(我已经做到了)。我已经设法为连接的组件编写了一个测试,但是我真的不确定这是否是正确的方法,以及我究竟想对连接的组件进行什么测试。

Container.jsx

import {connect} from 'react-redux';
import Login from './Login.jsx';
import * as loginActions from './login.actions';

const mapStateToProps = state => ({
  auth: state.auth
});
const mapDispatchToProps = dispatch => ({
  loginUser: credentials => dispatch(loginActions.loginUser(credentials))

});
export default connect(mapStateToProps, mapDispatchToProps)(Login);

Container.test.js

import React from 'react';
import {Provider} from 'react-redux';
import {mount, shallow} from 'enzyme';
import {expect} from 'chai';
import LoginContainer from '../../src/login/login.container';
import Login from '../../src/login/Login';


describe('Container Login', () => {
  it('should render the container component', () => {
    const storeFake = state => ({
      default: () => {
      },
      subscribe: () => {
      },
      dispatch: () => {
      },
      getState: () => ({ ...state })
    });
    const store = storeFake({
      auth: {
        sport: 'BASKETBALL'
      }
    });

    const wrapper = mount(
      <Provider store={store}>
        <LoginContainer />
      </Provider>
    );

    expect(wrapper.find(LoginContainer).length).to.equal(1);
    const container = wrapper.find(LoginContainer);
    expect(container.find(Login).length).to.equal(1);
    expect(container.find(Login).props().auth).to.eql({ sport: 'BASKETBALL' });
  });
});

问题答案:

这是个有趣的问题。

我通常会同时导入容器和组件以进行测试。对于容器测试,我使用redux-mock- store。组件测试用于测试异步功能。例如,在您的情况下,登录过程是使用sinon存根的异步功能。这是相同的片段

import React from 'react';
import {Provider} from 'react-redux';
import {mount, shallow} from 'enzyme';
import {expect} from 'chai';
import LoginContainer from '../../src/login/login.container';
import Login from '../../src/login/Login';
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { stub } from 'sinon';

const mockStore = configureMockStore([thunk]);

describe('Container Login', () => {
  let store;
  beforeEach(() => {
    store = mockStore({
      auth: {
        sport: 'BASKETBALL',
      },
    });
  });
  it('should render the container component', () => {
    const wrapper = mount(
      <Provider store={store}>
        <LoginContainer />
      </Provider>
    );

    expect(wrapper.find(LoginContainer).length).to.equal(1);
    const container = wrapper.find(LoginContainer);
    expect(container.find(Login).length).to.equal(1);
    expect(container.find(Login).props().auth).to.eql({ sport: 'BASKETBALL' });
  });

  it('should perform login', () => {
    const loginStub = stub().withArgs({
      username: 'abcd',
      password: '1234',
    });
    const wrapper = mount(<Login
      loginUser={loginStub}
    />);
  wrapper.find('button').simulate('click');
  expect(loginStub.callCount).to.equal(1);
  });
});


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

  • 问题内容: 我可能缺少一些非常明显的东西,想让自己清楚。 这是我的理解。 在幼稚的react组件中,我们有&。更新时会重新渲染整个组件。大多是只读的,更新它们没有任何意义。 在订阅redux商店的react组件中,通过类似于,它每次商店更新时都会重新渲染。 react- redux 有一个帮助程序,通常通过类似这样的方法来注入状态树的一部分(组件感兴趣)和actionCreators 组件 但是,

  • 问题内容: 我已经用Java实现了一个非常简单的ConnectionPool。它没有花哨的功能,只有获取/释放连接方法。 我如何测试它是否正常工作? 我知道那里有很多准备使用的连接池,它们比我将要使用的要可靠得多,但是我只是在尝试练习以了解连接池的工作方式。 谢谢! 如果有帮助,下面是代码: 还有我的PooledConnection.java: 问题答案: 你可以测试一下 在池为空时获得连接将为您

  • 问题内容: 我在我的第一个React Native项目中。我想创建一个仅处理来自api数据同步的HOC。然后,这将包装所有其他组件。 如果我是正确的,我的组件将通过在export语句中执行以下操作来增强所有其他组件: 我苦苦挣扎的概念还取决于React Redux Connect方法来检索其他redux状态。我的问题是如何同时使用两者?像这样吗 我可能在这里完全误解了这个概念,所以我非常感谢一些提

  • 最后,在中有一个子组件,名为。这就是问题所在。我还将从获得的项传递到。因此,数据流是(连接)>(未连接)>(连接)。 连接到Redux。它使用redux中的一些操作来更新中的项。当我在中更新时,可以很好地接收更新后的数据,但是却什么都接收不到。中的项从未更新。 我发现问题出在将连接到Redux时。如果没有连接到redux,它也会接收更新的道具,就像一样。 组件如下。我已经试着尽可能地简化它们。 D

  • import counter from './counter'; describe('counter reducers', () => { it('should handle initial state', () => {