2016-07-08 13 views
23

Próbuję użyć mount z Enzyme, aby przetestować mój składnik, w którym zagnieżdżono kilka komponentów Material Imi. Otrzymuję ten błąd podczas uruchamiania testu:Jak przekazać kontekst do metody montażu enzymu, aby przetestować komponent, który zawiera składnik Material UI?

TypeError: Cannot read property 'prepareStyles' of undefined

Po pewnym kopania, I did found that a theme needs to be passed down in a context. Robię to w teście, ale wciąż dostaję ten błąd.

Moje testy:

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); 
    }); 
}); 

Mój składnik searchbar jest bezpaństwowcem składnik, więc nie jestem pociągnięcie w dowolnym kontekście. Ale nawet kiedy jestem, wciąż mam ten sam błąd.

Co robię źle?

Odpowiedz

39

spróbuj dodać childContextTypes w opcjach mount:

return mount(
    <SearchBar {...props} />, { 
    context: {muiTheme}, 
    childContextTypes: {muiTheme: React.PropTypes.object} 
    } 
); 

Robiąc go ustawić opakowanie enzymu aby muiTheme dostępny do jego dzieci poprzez kontekst.

+0

Tak, właśnie tego brakowało. Sądzę, że będę musiał nieco przeszukać kontekst React, próbując przekazać 'contextTypes: {muiTheme: React.PropTypes.object}', ale nie 'childContextTypes'. Dzięki Nicolas! – Erika

+3

to samo działa z 'płytkim', po prostu wymień uchwyt płytką. –

+1

Dziękuję za to! Nie mogę uwierzyć, że to było takie proste. Już zaakceptowałem, że będę musiał zawsze owijać moje przetestowane komponenty u dostawcy sklepu redux. – gustavohenke