J'essaie d'utiliser mount
d'Enzyme pour tester mon composant dans lequel plusieurs composants Material UI sont imbriqués. J'obtiens cette erreur lors de l'exécution du test:
TypeError: Cannot read property 'prepareStyles' of undefined
Après quelques recherches, j'ai trouvé qu'un thème doit être transmis dans un contexte . Je fais cela dans le test mais j'obtiens toujours cette erreur.
Mon test:
import expect from 'expect';
import React, {PropTypes} from 'react';
import {mount} from 'enzyme';
import SearchBar from './SearchBar';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
function setup() {
const muiTheme = getMuiTheme();
const props = {
closeSearchBar: () => {},
fetchSearchData: () => {},
data: [],
searching: false
};
return mount(<SearchBar {...props} />, {context: {muiTheme}});
}
describe('SearchBar Component', ()=> {
it('Renders search toolbar properly', () => {
const wrapper = setup();
expect(wrapper.find('.toolbar').length).toBe(1);
expect(wrapper.find('button').length).toBe(1);
});
});
Mon composant de barre de recherche est un composant sans état, donc je ne tire dans aucun contexte. Mais même quand je le suis, je reçois toujours la même erreur.
Qu'est-ce que je fais mal?
Essayez d'ajouter childContextTypes
dans les options mount
:
return mount(
<SearchBar {...props} />, {
context: {muiTheme},
childContextTypes: {muiTheme: React.PropTypes.object}
}
);
Ce faisant, vous définissez le wrapper Enzyme pour rendre le muiTheme
accessible à ses enfants via le contexte.
ceci est ma méthode pratique pour tester l'interface utilisateur matérielle avec peu profonde et monter
...
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'
import getMuiTheme from 'material-ui/styles/getMuiTheme';
const muiTheme = getMuiTheme();
const shallowWithContext = (node) => shallow(node, {context: {muiTheme}, childContextTypes: {muiTheme: PropTypes.object}});
const mountWithContext = (node) => mount(
node, {context: {muiTheme}, childContextTypes: {muiTheme: PropTypes.object}}
);
// now you can do
const wrapper = shallowWithContext(<Login auth={auth} onChange={() => 'test'} />);