Redux: Comment faire pour tester un composant connecté?
Je suis en utilisant Enzyme
à l'unité de test de mon Réagir composants. Je comprends que, dans le but de tester le raw sans lien de la composante j'aurais juste à l'exportation et le tester (je l'ai fait). J'ai réussi à écrire un test pour le composant connecté mais je suis vraiment pas sûr si ce est la bonne façon et aussi exactement ce que j'aurais envie de le tester pour l'appareil connecté.
Conteneur.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' });
});
});
Vous devez vous connecter pour publier un commentaire.
C'est une question intéressante.
J'ai l'habitude de faire importer des conteneurs et composants pour effectuer le test. Pour le conteneur de test que j'utilise,
redux-mock-store
. Tester les composants de test async fonctions. Par exemple, dans votre cas, le processus de connexion est un async fonction à l'aide desinon
talons. Voici un extrait de la même,Comme vous l'avez souligné, la façon dont j'ai l'habitude de le faire est d'exporter l'onu-composant connecté en tant que bien, et de le tester.
c'est à dire
Voici un exemple. Source du composant, et source de l'tests.
Pour le enveloppés composant, je ne suis pas l'auteur des essais pour les personnes parce que mon mappages (
mapStateToProps
etmapDispatchToProps
) sont généralement très simple. Si j'ai voulu tester un enveloppé composant, j'aimerais vraiment tester ces cartes. Voici donc ce que je voudrais choisir explicitement test, plutôt que de re-tester le composant entier enveloppé dans un formulaire.Il y a deux façons de tester ces fonctions. Un autre moyen serait d'exporter les fonctions dans le module lui-même.
c'est à dire;
export {mapStateToProps, mapDispatchToProps}
Je ne suis pas un grand fan de cela, parce que je ne veux pas que d'autres modules dans l'application pour y accéder. Dans mes tests, j'utilise parfois babel-plugin-rewire d'accès "à la portée" des variables, de sorte que c'est ce que je ferais dans cette situation.
Qui pourrait ressembler à quelque chose comme:
import Login from ../login
de l'onu-composant connecté. La raison pour laquelle je ne l'ai pas utilisé {Login} est parce qu'ils se trouvent dans des fichiers séparés.babel-plugin-rewire
et testmapStateToProps
etmapDispatchToProps
plutôt que de le enveloppés composant lui-même.mapStateToProps
etmapDispatchToProps
comment? Pouvez-vous donner un exemple s'il vous plaît?babel-plugin-rewire
tbh. Et je ne suis pas vraiment sûr de ce que vous vouliez dire dans la première option.export {Login}
et puisimport {Login}
dans votre test, vous risquez de neexport {Login, mapStateToProps}
etimport {Login, mapStateToProps}
.mapStateToProps
,mapDispatchToProps
, etmergeProps
pour le plaisir de les tester. Je n'avais aucune idée quebabel-plugin-rewire
était une option, je vais essayer cela un certain temps.Si nous avons un routeur problème, nous pouvons considérer que le routeur lib dans le fichier de test, par exemple: