आपको एंजाइम / रिएक्ट परीक्षणों में रेंडर और उथले का उपयोग कब करना चाहिए?


95

इस प्रश्न को पोस्ट करने से पहले, मैंने sqa stackexchange में खोज करने की कोशिश की, लेकिन मुझे उथले और वहाँ प्रस्तुत करने के बारे में कोई पोस्ट नहीं मिली, इसलिए मुझे उम्मीद है कि कोई व्यक्ति मेरी मदद कर सकता है।

मुझे उथले का उपयोग कब करना चाहिए और परीक्षण घटकों में रेंडर करना चाहिए? Airbnb डॉक्स के आधार पर, मैंने दो के अंतर पर कुछ राय दी है:

  1. चूंकि उथला एक घटक के रूप में घटकों का परीक्षण कर रहा है , इसलिए इसका उपयोग 'मूल' घटकों के लिए किया जाना चाहिए। (पूर्व सारणी, आवरण, आदि)

  2. रेंडर बाल घटकों के लिए है।

मैंने यह प्रश्न पूछा है, यह है कि मुझे यह जानने में कठिन समय है कि मुझे कौन सा उपयोग करना चाहिए (हालांकि डॉक्स का कहना है कि यह बहुत समान है)

तो, मुझे कैसे पता चलेगा कि किसी विशिष्ट परिदृश्य में किसका उपयोग करना है?


2
उथले () और माउंट के बीच का अंतर यह है कि उथले () माउंट किए गए बच्चे के घटकों से अलगाव में घटकों का परीक्षण करते हैं (माउंट) और गहराई में जाते हैं और एक घटक के बच्चों का परीक्षण करते हैं। उथले () के लिए इसका अर्थ है कि यदि मूल घटक किसी अन्य घटक को प्रस्तुत करता है जो प्रस्तुत करने में विफल रहता है, तो माता-पिता पर एक उथले () प्रतिपादन अभी भी पास होगा।
श्याम कुमार

जवाबों:


162

एंजाइम डॉक्स के अनुसार :

mount(<Component />) फुल डोम रेंडरिंग उन मामलों के लिए आदर्श है जहां आपके पास ऐसे घटक हैं जो DOM एपिस के साथ बातचीत कर सकते हैं, या पूरी तरह से घटक का परीक्षण करने के लिए पूर्ण जीवनचक्र की आवश्यकता हो सकती है (यानी, घटकडिमाउंट आदि)

बनाम

shallow(<Component />) उथले प्रतिपादन के लिए एक इकाई के रूप में एक घटक का परीक्षण करने के लिए खुद को विवश करने के लिए उपयोगी है, और यह सुनिश्चित करने के लिए कि आपके परीक्षण अप्रत्यक्ष रूप से बाल घटकों के व्यवहार पर जोर नहीं दे रहे हैं।

बनाम

renderजिसका उपयोग स्थिर HTML में प्रतिक्रिया घटकों को प्रस्तुत करने और परिणामस्वरूप HTML संरचना का विश्लेषण करने के लिए किया जाता है ।

आप अभी भी एक उथले रेंडर में अंतर्निहित "नोड्स" देख सकते हैं, इसलिए उदाहरण के लिए, आप एवीए का उपयोग कर इस तरह से कुछ (थोड़ा आकस्मिक) उदाहरण दे सकते हैं :

let wrapper = shallow(<TagBox />);

const props = {
    toggleValue: sinon.spy()
};

test('it should render two top level nodes', t => {
    t.is(wrapper.children().length, 2);
});

test('it should safely set all props and still render two nodes', t => {
    wrapper.setProps({...props});
    t.is(wrapper.children().length, 2);
});

test('it should call toggleValue when an x class is clicked', t => {
    wrapper.setProps({...props});
    wrapper.find('.x').last().simulate('click');
    t.true(props.toggleValue.calledWith(3));
});

ध्यान दें कि रेंडरिंग , प्रॉप्स सेट करना और चयनकर्ताओं और यहां तक ​​कि सिंथेटिक इवेंट्स को सभी उथले रेंडरिंग द्वारा सपोर्ट किया जाता है, इसलिए ज्यादातर बार आप इसका इस्तेमाल कर सकते हैं।

लेकिन, आप घटक का पूरा जीवनचक्र प्राप्त नहीं कर पाएंगे, इसलिए यदि आप कंपोनेंटडिमाउंट में होने वाली चीजों की अपेक्षा करते हैं, तो आपको उपयोग करना चाहिए mount(<Component />);

इस परीक्षण में घटक की जासूसी करने के लिए सिनॉन का उपयोग किया जाता हैcomponentDidMount

test.only('mount calls componentDidMount', t => {

    class Test extends Component {
        constructor (props) {
            super(props);
        }
        componentDidMount() {
            console.log('componentDidMount!');
        }
        render () {
            return (
                <div />
            );
        }
    };

    const componentDidMount = sinon.spy(Test.prototype, 'componentDidMount');
    const wrapper = mount(<Test />);

    t.true(componentDidMount.calledOnce);

    componentDidMount.restore();
});

ऊपर उथले प्रतिपादन या रेंडर के साथ पारित नहीं होगा

render आपको केवल html प्रदान करेगा, इसलिए आप अभी भी इस तरह से सामान कर सकते हैं:

test.only('render works', t => {

    // insert Test component here...

    const rendered = render(<Test />);
    const len = rendered.find('div').length;
    t.is(len, 1);
});

उम्मीद है की यह मदद करेगा!


1
मैं अभी भी 100% नहीं मिलता, क्यों तीन क्रियाएं उनके साथ अलग-अलग तरीके लाती हैं। उदाहरण के लिए कोई भी उथले में आवरण (।) का उपयोग कर सकता है लेकिन रेंडर में नहीं। कोई स्पष्टीकरण / लिंक / डॉक्स / ब्लॉग, जो मुझे इस togehter को प्राप्त करने में मदद करते हैं?
पॉलक्वेप

@HenryZhu यह डॉक्स से स्पष्ट होना चाहिए कि रेंडर की तुलना में रेंडर अधिक शामिल है, क्योंकि यह वास्तव में उस विशेष घटक नोड के लिए DOM ट्री की नकल करने की कोशिश करता है
AGE

11
v2 से v3 तक एंजाइम प्रवासन ने उथले में डिफ़ॉल्ट रूप से जीवनचक्र के तरीकों को बनाया है साथ ही github.com/airbnb/enzyme/blob/master/docs/guides/…
अभिनव सिंगी

1
मतभेदों की अच्छी अतिरिक्त व्याख्या यहाँ है github.com/airbnb/enzyme/issues/465#issuecomment-227697726 और यहाँ github.com/airbnb/enzyme/issues/465#issuecomment-229116418
दिमित्री गॉन्चर

9

उथले () और माउंट के बीच का अंतर यह है कि उथले () माउंट किए गए बच्चे के घटकों से अलगाव में घटकों का परीक्षण करता है (माउंट) और गहराई में जाता है और एक घटक के बच्चों का परीक्षण करता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.