ফ্যাক্টরিগার্লের বিল্ড এবং তৈরি পদ্ধতিগুলির মধ্যে পার্থক্য কী?


96

কারখানার গার্ল পরিচয়FactoryGirl.build() এবং এর মধ্যে পার্থক্যটি বর্ণনা করে FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

আমি এখনও দুজনের মধ্যে ব্যবহারিক পার্থক্য বুঝতে পারি না। কেউ যদি একটি উদাহরণ দিতে পারে যেখানে আপনি অন্যটি ব্যবহার করতে চান না তবে অন্যটি ব্যবহার করতে চান? ধন্যবাদ!

উত্তর:


120

create()পদ্ধতিটি কেবল মডেলটির উদাহরণ ধরে build()রাখে যখন পদ্ধতিটি কেবল স্মৃতিতে রাখে।

ব্যক্তিগতভাবে, আমি create()কেবল তখনই পদ্ধতিটি ব্যবহার করি যখন ডিবিতে লেখার জন্য সময় সাপেক্ষে পরীক্ষার ব্যবস্থা করা অধ্যবসায় করা সত্যই প্রয়োজন।

যেমন

আমি প্রমাণীকরণের জন্য ব্যবহারকারীদের তৈরি করি create()কারণ আমার প্রমাণীকরণ ইঞ্জিন ডিবি-কে অনুসন্ধান করে।

build()কোনও ডিবি অ্যাক্সেসের প্রয়োজন নেই বলে কোনও মডেলের কোনও বৈশিষ্ট্য রয়েছে কিনা তা পরীক্ষা করতে হবে method

it{Factory.build(:user).should respond_to(:name)}

হালনাগাদ

"আপনি একটি সমিতি তৈরি করার সময় একটি ব্যতিক্রম প্রকৃতপক্ষে তৈরি করে 'যেমন' আপনার সমিতি আর স্মৃতিতে থাকে না কিন্তু স্থির থাকে that এটিকে মনে রাখবেন" - শেকস


16
একটি ব্যতিক্রম আছে যা বিল্ডিং আসলে 'তৈরি করে' যখন আপনি সমিতি তৈরি করছেন, অর্থাত্ আপনার সমিতি আর স্মৃতিতে থাকে না কিন্তু স্থির থাকে। যে রাখুন মনের মধ্যে
শেকস

@ শেকস, আমি আর রেলের কাজ করি না। আমি যত তাড়াতাড়ি সম্ভব এটি পরীক্ষা করব।
হেলিও স্যান্টোস

যে কেউ প্রতিটি নিদর্শনের প্রতিস্থাপন করতে একটি হাতিয়ার করেছেন createসঙ্গে build, এবং এটি পূর্বাবস্থা যদি পরীক্ষা ব্যর্থ?
মিগল্ড

#createডিস্ক থেকে স্থির অবজেক্টটি পড়ে কি ফেরত দেয়, বা অবিরাম থাকার পরে স্মৃতিতে থাকা অবজেক্টটি কী তা ফেরত দেয়? অন্য কথায়, create(...)সমান করছেন create(...).reload?
ডেনিস

@ এমগোল্ড ভিম এই ধরণের জিনিসটিতে বেশ ভাল।
সীমিত প্রায়শ্চিত্ত

15

ব্যবহার FactoryGirl.build(:factory_name)ডিবিতে স্থির থাকে না এবং কল করে না save!, তাই আপনার অ্যাক্টিভ রেকর্ডের বৈধতা চলবে না। এটি অনেক দ্রুত, তবে বৈধতাগুলি গুরুত্বপূর্ণ হতে পারে।

ব্যবহার FactoryGirl.create(:factory_name)ডিবিতে অবিরত থাকবে এবং অ্যাক্টিভ রেকর্ডের বৈধতাগুলি কল করবে। এটি স্পষ্টতই ধীর গতিযুক্ত তবে বৈধতা ত্রুটিগুলি ধরতে পারে (যদি আপনি তাদের পরীক্ষাগুলিতে সেগুলি যত্নশীল হন)।


11
অথবা, আপনি কেবল ফ্যাক্টরিগার্ল.বিল্ড (: ফ্যাক্টরি_নাম) করতে পারেন? অবৈধ? যা ডাটাবেসে সংরক্ষণ না করে বৈধতা চালায়।
jinavar1

1

FactoryGirl.create()এটির জন্য নতুন অবজেক্ট এবং সমিতি তৈরি করবে (যদি কারখানার কোনও থাকে)। এগুলি সমস্ত একটি ডাটাবেসে অবিচল থাকবে। এছাড়াও, এটি মডেল এবং ডাটাবেস বৈধতা উভয়ই ট্রিগার করবে। কলব্যাক after(:build)এবং after(:create)কারখানাটি সংরক্ষণের পরে কল করা হবে। এছাড়াও before(:create)সামনে কারখানা সংরক্ষিত হয় ডাকা হবে।

FactoryGirl.build()কোনও বস্তু সংরক্ষণ করবে না, তবে কারখানায় অ্যাসোসিয়েশন থাকলে একটি ডাটাবেসে অনুরোধ জানাবে। এটি কেবলমাত্র সম্পর্কিত বিষয়গুলির জন্য বৈধতাগুলি ট্রিগার করবে। after(:build)কারখানাটি তৈরি হওয়ার পরে কলব্যাক কল করা হবে।

মনে রাখবেন যে বেশিরভাগ ক্ষেত্রে যখন পরীক্ষামূলক মডেলগুলি আরও build_stubbedভাল পারফরম্যান্সের জন্য ব্যবহার করা ভাল। এটি সম্পর্কে এখানে আরও পড়ুন ।

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