2016-03-23 11 views
13

आवेदन की जटिलता के कारण मैं काम कर रहा हूं, मैंने बाल घटकों के अनुपात के रूप में एक क्रिया पारित करने के बजाय नेस्टेड रेडक्स कंटेनर का उपयोग करने का निर्णय लिया है। हालांकि, यहके साथ के साथ mocha, chai और sinon के साथ संयोजन में यूनिट परीक्षण के लिए समस्याग्रस्त साबित हुआ है।रिएक्ट और रेडक्स के साथ नेस्टेड कंटेनर वाले घटक का परीक्षण कैसे करें?

<OuterContainer> 
    <div> 
    <InnerContainer /> 
    </div> 
</OuterContainer> 

जहां OuterContainer & InnerContainer कनेक्ट के साथ लिपटे रहे हैं:

यहाँ दृश्य संरचना का एक काल्पनिक उदाहरण है। उदा .:

export connect(<mapStateToProps>)(<Component>)

जब चल परीक्षण त्रुटि मैं हो रही है: Invariant Violation: Could not find "store" in either the context or props of "Connect(Component)". Either wrap the root component in a `<Provider>`, or explicitly pass "store" as a prop to "Connect(Component)".

वहाँ खोलने या उथले प्रतिपादन का उपयोग किए बिना इकाई परीक्षण के लिए InnerContainer ठूंठ के लिए एक रास्ता है?

उत्तर

20

परीक्षण करते समय <Provider> में अपना घटक लपेटें। यह आपके ऊपर है कि वास्तविक स्टोर या { dispatch, getState, subscribe } के साथ एक नकली आपूर्ति करना है या नहीं। <Provider store={store}> में बाहरीतम घटक को लपेटने से दुकान को बच्चे के घटकों को घोंसले के किसी भी स्तर पर भी उपलब्ध कराया जाएगा-जैसे ऐप में ही।

const store = createStore(reducer) // can also be a mock 
ReactTestUtils.renderIntoDocument(
    <Provider store={store}> 
    <OuterContainer /> 
    </Provider> 
) 
+0

बढ़िया! सलाह के लिए धन्यवाद। इसे अब जाना :) :) –

+0

एक आकर्षण की तरह काम करता है। धन्यवाद फिर से @DanAbramov! –

+3

@ दान-अब्रामोव: यह काम करता है। हालांकि, यह वास्तव में अब एक यूनिट परीक्षण नहीं है। एंजाइम 'उथला 'है, लेकिन यह अभी भी एक जुड़े बच्चे घटक के साथ गहरा हो जाता है। क्या आपको कोई विचार है कि क्या यह जांचना संभव है कि '' इसे प्रस्तुत किए बिना है? – publicJorn

0

एक और तरीका दोनों घटक को कनेक्टेड और कंटेनर निर्यात करने के लिए निर्यात करना है। निश्चित रूप से कंटेनर डिफ़ॉल्ट रूप से।

export const Comp = (props) => (<p>Whatever</p>) 
export default connect(...)(Comp) 

इसलिए, आप यूनिट परीक्षण Comp कर सकते हैं।

+0

लेकिन यह पूर्ण Redux लिंकेज के साथ घटक का परीक्षण करने के उद्देश्य को हरा देता है। है ना? – shobhit1

+1

@ shobhit1 लेकिन फिर आप अपने घटक और 'कनेक्ट' का परीक्षण कर रहे हैं जिसे पहले से ही 'प्रतिक्रिया-रेडक्स' द्वारा परीक्षण किया गया है। बुरा नहीं है, न तो अच्छा है। आप बस overtesting कर रहे हैं। – sospedra

+1

यह प्रश्न नहीं करेगा, जैसा कि प्रश्न में है, 'कॉम्प' स्वयं आयात करता है और अन्य कंटेनर का उपयोग करता है। उप-संयोजक तब 'स्टोर' मौजूद होने की उम्मीद करेगा, और परीक्षण विफल हो जाएगा। – csvan

0

सुनिश्चित नहीं है कि आपकी समस्या क्या है, लेकिन मुझे यकीन है कि इससे शायद इस फ़ीड को देखने वाले कुछ लोगों की मदद मिलेगी।

मैं एक ही त्रुटि थी और यह आसानी से ठीक किया गया था:

मैं अपने घटक अपनी प्रविष्टि फ़ाइल में मेरी दुकान वस्तु पारित करने के लिए भूल गया था (webpack का उपयोग)।

मैं बस रूट घटक "दुकान = {दुकान}" के लिए एक विशेषता को जोड़ नीचे देखें:

document.addEventListener("DOMContentLoaded",() => { 
     const store = configureStore(); 
     ReactDOM.render(<Root store={store} />, 
    document.getElementById('content')); 
    }); 

यह रूप में अच्छी तरह के संदर्भ के लिए मेरी जड़ फ़ाइल कोड था:

import React from 'react'; 
    import { Provider } from 'react-redux'; 
    import App from './app'; 

    const Root = ({ store }) => (
    <Provider store={ store }> 
     <App /> 
    </Provider> 
    ); 

निर्यात डिफ़ॉल्ट रूट;

आशा है कि किसी की मदद करें!

0

बच्चे घटक को वापस करने के लिए Provider घटक नकल करें।

describe() से पहले इसे जोड़ें।

jest.mock('Provider',() => ({children}) => children);

संबंधित मुद्दे