এনজাইম / প্রতিক্রিয়া পরীক্ষায় কখন রেন্ডার এবং অগভীর ব্যবহার করা উচিত?


98

এই প্রশ্নটি পোস্ট করার আগে, আমি স্কোয়া স্ট্যাকেক্সচেঞ্জে অনুসন্ধান করার চেষ্টা করেছি তবে অগভীর এবং সেখানে রেন্ডার সম্পর্কিত কোনও পোস্ট পাইনি, তাই আমি আশা করি কেউ এখানে আমাকে সহায়তা করতে পারে।

আমি কখন অগভীর ব্যবহার করব এবং উপাদানগুলির প্রতিক্রিয়া পরীক্ষায় রেন্ডার করব? এয়ারবিএনবি ডক্সের ভিত্তিতে, আমি উভয়ের পার্থক্যের বিষয়ে কিছু মতামত জানিয়েছি:

  1. যেহেতু অগভীর উপাদানগুলি ইউনিট হিসাবে পরীক্ষা করছে , তাই এটি 'প্যারেন্ট' উপাদানগুলির জন্য ব্যবহার করা উচিত। (উদা। টেবিল, মোড়ানো ইত্যাদি)

  2. রেন্ডার শিশু উপাদানগুলির জন্য।

আমি এই প্রশ্নটি জিজ্ঞাসা করার কারণটি হ'ল আমার কোনটি ব্যবহার করা উচিত তা নির্ধারণ করার জন্য আমার খুব কষ্ট হচ্ছে (যদিও ডক্স বলছে যে তারা খুব অনুরূপ)

সুতরাং, আমি কীভাবে একটি নির্দিষ্ট দৃশ্যে কোনটি ব্যবহার করব তা জানব?


4
অগভীর () এবং মাউন্ট () এর মধ্যে পার্থক্য হ'ল অগভীর () মাউন্ট () আরও গভীর হয় এবং একটি উপাদানগুলির বাচ্চাদের পরীক্ষা করে যখন তারা রেন্ডার করে এমন শিশু উপাদানগুলি থেকে বিচ্ছিন্নকরণের উপাদানগুলি পরীক্ষা করে। অগভীর জন্য () এর অর্থ হ'ল যদি পিতামণ্ডল উপাদানটি অন্য কোনও উপাদানকে রেন্ডার করতে ব্যর্থ হয় তবে পিতামাতার উপর একটি অগভীর () রেন্ডারিং এখনও পাস হবে।
শ্যাম কুমার

উত্তর:


167

এনজাইম ডক্স অনুসারে :

mount(<Component />) সম্পূর্ণ ডিওএম রেন্ডারিং ব্যবহারের ক্ষেত্রে আদর্শ যেখানে আপনার এমন উপাদান রয়েছে যা ডিওএম এপিসের সাথে ইন্টারেক্ট করতে পারে, বা উপাদানটি সম্পূর্ণরূপে পরীক্ষা করার জন্য পুরো জীবনচক্রের প্রয়োজন হতে পারে (যেমন, উপাদানডিডমন্ট ইত্যাদি))

বনাম

shallow(<Component />) কারণ অগভীর রেন্ডারিং নিজেকে ইউনিট হিসাবে কোনও উপাদানকে পরীক্ষা করার ক্ষেত্রে সীমাবদ্ধ রাখতে এবং আপনার পরীক্ষাগুলি অপ্রত্যক্ষভাবে শিশু উপাদানগুলির আচরণের উপর জোর দিচ্ছে না তা নিশ্চিত করার জন্য দরকারী।

বনাম

renderযা স্থির এইচটিএমএলে প্রতিক্রিয়া উপাদানগুলি রেন্ডার করতে এবং ফলস্বরূপ 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 আপনাকে কেবল এইচটিএমএল সরবরাহ করবে, সুতরাং আপনি এখনও এই জাতীয় জিনিসগুলি করতে পারেন:

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

    // insert Test component here...

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

আশাকরি এটা সাহায্য করবে!


4
আমি এখনও 100% পেতে পারি না কেন তিনটি ক্রিয়াগুলি তাদের সাথে বিভিন্ন পদ্ধতি নিয়ে আসে। উদাহরণস্বরূপ, কেউ অগভীর মধ্যে র্যাপার.জেটনোড () ব্যবহার করতে পারে তবে রেন্ডারে নয়। কোনও ব্যাখ্যা / লিংক / ডক্স / ব্লগ, যা আমাকে এই টোজিটার পেতে সহায়তা করে?
পলকোয়াপে

@ হেনরিঝু এটি যে ডক্স থেকে রেন্ডার অগভীর চেয়ে বেশি জড়িত তা স্পষ্ট হওয়া উচিত, কারণ এটি সেই নির্দিষ্ট উপাদান নোডের জন্য ডিওএম গাছের নকল করার চেষ্টা করে
এজিই

12
ভি 2 থেকে ভি 3-তে এনজাইম স্থানান্তর অগভীর পাশাপাশি ডিফল্টরূপে github.com/airbnb/enzyme/blob/master/docs/guides/…
অভিনব সিংগি

4
পার্থক্যের ভাল অতিরিক্ত ব্যাখ্যা এখানে github.com/airbnb/enzyme/issues/465#issuecomment-227697726 এবং এখানে github.com/airbnb/enzyme/issues/465#issuecomment-229116418
দিমিত্রি

9

অগভীর () এবং মাউন্ট () এর মধ্যে পার্থক্য হ'ল অগভীর () মাউন্ট () আরও গভীর হয় এবং একটি উপাদানগুলির বাচ্চাদের পরীক্ষা করে যখন তারা রেন্ডার করে এমন শিশু উপাদানগুলি থেকে বিচ্ছিন্নকরণের উপাদানগুলি পরীক্ষা করে।

অগভীর জন্য () এর অর্থ হ'ল যদি পিতামণ্ডল উপাদানটি অন্য কোনও উপাদান সরবরাহ করে যা রেন্ডার করতে ব্যর্থ হয় তবে পিতামাতার উপর একটি অগভীর () রেন্ডারিং এখনও পাস হবে।


আমি যখন propsকোন উপাদানটির জন্য পরীক্ষা করব তখন আমার কি ব্যবহার করা উচিত shallowএবং mount?
মেনাই আলা এডডাইন - আলাদিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.