আপনার প্রশ্নটি ছিল এমএস নকলের কাঠামোটি এনএমকের থেকে কীভাবে আলাদা এবং এটি অন্যান্য উত্তরগুলির মধ্যে কিছু সমাধান করেছে তা উপস্থিত রয়েছে, তবে তারা কীভাবে একই এবং সেগুলি কীভাবে আলাদা সে সম্পর্কে আরও কিছু তথ্য এখানে। এনমক রাইনোমকস এবং মকের সাথেও সমান, তাই আমি তাদের এনএমকের সাথে ভাগ করে নিচ্ছি।
এনএমক / রাইনোমকস / মোক এবং এমএস নকল ফ্রেমওয়ার্কের মধ্যে আমি সরাসরি 3 টি প্রধান পার্থক্য দেখতে পাচ্ছি:
এমএস নকল কাঠামোটি জেনেরিক ধরণের পরিবর্তে ভিজ্যুয়াল স্টুডিওর পূর্ববর্তী সংস্করণগুলিতে অ্যাকসেসরের মতো উত্পন্ন কোড ব্যবহার করে। আপনি যখন নির্ভরতার জন্য নকল কাঠামোটি ব্যবহার করতে চান, আপনি পরীক্ষার প্রকল্পের রেফারেন্সগুলির সাথে নির্ভরশীলতা সম্বলিত সমাবেশটি যুক্ত করুন এবং তারপরে টেস্টের দ্বিগুণ (স্টাবস বা শিমস) জেনারেট করতে ডান ক্লিক করুন click তারপরে আপনি যখন পরীক্ষা করছেন, আপনি আসলে পরিবর্তে এই উত্পন্ন ক্লাসগুলি ব্যবহার করছেন। এনমক একই জিনিসটি (যেমন IStudentRepository studentRepository = mocks.NewMock<IStudentRepository>()
) সম্পাদন করতে জেনেরিক ব্যবহার করে । আমার মতে, এমএস ফেকস ফ্রেমওয়ার্ক পদ্ধতির পরীক্ষাগুলি থেকে কোড নেভিগেশন এবং রিফ্যাক্টরিংকে বাধা দেয় কারণ আপনি প্রকৃত ইন্টারফেসের পরিবর্তে না বরং উত্পন্ন শ্রেণীর বিরুদ্ধে কাজ করছেন।
মাইক্রোসফট ফ্রেমওয়ার্ক সরবরাহ নিবন্ধসমূহ এবং মাপ (শিম্স), যেহেতু NMock, RhinoMocks এবং MOQ সব নিবন্ধসমূহ এবং প্রদান fakes ঠাট্টা । আমি এমএসের বিদ্রূপগুলি অন্তর্ভুক্ত না করার সিদ্ধান্তটি সত্যই বুঝতে পারি না এবং আমি নীচে বর্ণিত কারণে ব্যক্তিগতভাবে মোলের ভক্ত নই।
এমএস নকল কাঠামোর সাহায্যে আপনি যে পদ্ধতিগুলিতে স্টাব করতে চান তার বিকল্প বাস্তবায়ন সরবরাহ করেন। এই বিকল্প বাস্তবায়নের মধ্যে, আপনি রিটার্ন মানগুলি নির্দিষ্ট করতে পারেন এবং পদ্ধতিটি কীভাবে ডাকা হয়েছিল বা কীভাবে তা সম্পর্কে তথ্য ট্র্যাক করতে পারেন। এনমক, রাইনোমকস এবং মোকের সাহায্যে আপনি একটি মক অবজেক্ট তৈরি করেন এবং তারপরে স্ট্যাবড রিটার্ন মানগুলি নির্দিষ্ট করার জন্য বা মিথস্ক্রিয়াগুলি (কীভাবে পদ্ধতিগুলি বলা হয়েছিল এবং কীভাবে) ট্র্যাক করতে ব্যবহার করুন। আমি এমএস নকলগুলি আরও জটিল এবং কম ভাবপূর্ণ বলে মনে করি।
ফ্রেমওয়ার্কগুলি কী সরবরাহ করে তার মধ্যে পার্থক্যটি স্পষ্ট করতে: এনমক, রাইনোমকস এবং মক সকলে দুটি ধরণের টেস্ট ডাবল (স্টাবস এবং মকস) সরবরাহ করে। জাল কাঠামো স্টাব এবং মোল সরবরাহ করে (তারা এগুলিকে শিম বলে) এবং দুর্ভাগ্যক্রমে মককে অন্তর্ভুক্ত করে না। এনএমক এবং এমএস ফেকসের মধ্যে পার্থক্য এবং সাদৃশ্য বুঝতে, এই বিভিন্ন ধরণের পরীক্ষার দ্বিগুণ কী তা বোঝা সহায়ক:
স্টাবস: স্ট্যাবগুলি তখন ব্যবহার করা হয় যখন আপনাকে কোনও পদ্ধতি বা বৈশিষ্ট্যের জন্য কোনও মান সরবরাহ করতে হয় যা পরীক্ষার অধীনে পদ্ধতিতে আপনার পরীক্ষার দ্বিগুণ সম্পর্কে জিজ্ঞাসা করা হবে। উদাহরণস্বরূপ, যখন পরীক্ষার অধীনে আমার পদ্ধতিটি IStudentRepository পরীক্ষাটির doStudentExist () পদ্ধতি ডাবল করে, আমি চাই এটি সত্যে ফিরে আসুক।
এনমক এবং এমএস জালিয়াতির স্টাবগুলির ধারণাটি একই, তবে এনমকের সাথে আপনি এই জাতীয় কিছু করবেন:
Stub.On(mockStudentRepository).Method("DoesStudentExist").Will(Return.Value(true));
এবং এমএসফেকসের সাহায্যে আপনি কিছুটা এইভাবে করবেন:
IStudentRepository studentRepository = new DataAccess.Fakes.StubIStudentRepository() // Generated by Fakes.
{
DoesStudentExistInt32 = (studentId) => { return new Student(); }
};
এমএস নকলের বিজ্ঞপ্তিতে আপনি নোটস স্টুডেন্টএক্সজিস্ট পদ্ধতির জন্য সম্পূর্ণ নতুন বাস্তবায়ন তৈরি করেছেন (নোট করুন যে এটি ডাসস্টুডেন্টএক্সজিস্ট ইন্ট 32 বলে কারণ নকল কাঠামোটি স্ট্রেড অবজেক্টস উত্পন্ন করার সময় পদ্ধতির নামগুলিতে প্যারামিটার ডেটা টাইপগুলিকে সংযোজন করে, আমি মনে করি এটি স্পষ্ট করে দেয়) পরীক্ষাগুলো). সত্যি কথা বলতে NMock বাস্তবায়নও আমাকে বাগ দেয় কারণ এটি পদ্ধতির নাম সনাক্ত করতে একটি স্ট্রিং ব্যবহার করে। (এনএমক ব্যবহারের উদ্দেশ্যে কীভাবে আমি ভুল বুঝেছি তা যদি আমাকে ক্ষমা করুন This) এই পদ্ধতিটি সত্যই রিফ্যাক্টরিংয়ে বাধা দেয় এবং আমি এই কারণে এনমকের উপরে রাইনোমকস বা মককে অত্যন্ত সুপারিশ করব।
মোকস: পরীক্ষার অধীনে আপনার পদ্ধতি এবং এর নির্ভরতাগুলির মধ্যে পারস্পরিক মিথস্ক্রিয়া যাচাই করতে মক ব্যবহার করা হয়। এনমকের সাথে, আপনি এটির মতো প্রত্যাশা সেট করে এটি করেন:
Expect.Once.On(mockStudentRepository).Method("Find").With(123);
এই কারণেই আমি এনএমকে রাইনোমকস এবং মককে প্রাধান্য দিই, এনএমক পুরানো প্রত্যাশা শৈলী ব্যবহার করে যেখানে রাইনোমকস এবং মোক উভয়ই সাজানো / আইন / সংস্থান পদ্ধতির সমর্থন করে যেখানে আপনি পরীক্ষার শেষে যেমন প্রত্যাশিত মিথস্ক্রিয়াগুলি নির্দিষ্ট করেছেন :
stubStudentRepository.AssertWasCalled( x => x.Find(123));
আবার, নোট করুন যে রাইনোমকস পদ্ধতিটি সনাক্ত করতে স্ট্রিংয়ের পরিবর্তে ল্যাম্বডা ব্যবহার করে। এমএস নকল কাঠামো মোটেও মক সরবরাহ করে না। এর অর্থ হল যে আপনার স্ট্যাবড বাস্তবায়নগুলিতে (উপরের স্টাবগুলির বিবরণ দেখুন) আপনাকে ভেরিয়েবল সেট করতে হবে যা আপনি পরে যাচাই করেছেন তা সঠিকভাবে সেট করা হয়েছিল। এটি দেখতে এরকম কিছু দেখাবে:
bool wasFindCalled = false;
IStudentRepository studentRepository = new DataAccess.Fakes.StubIStudentRepository()
{
DoesStudentExistInt32 = (studentId) =>
{
wasFindCalled = true;
return new Student();
}
};
classUnderTest.MethodUnderTest();
Assert.IsTrue(wasFindCalled);
আপনার এই স্ট্রোকটিতে কল আপ ট্র্যাক করতে হবে এবং পরে পরীক্ষায় এটি দৃ .়ভাবে জানাতে হবে বলে আমি এই পদ্ধতিকে কিছুটা বিশৃঙ্খলাবদ্ধ বলে মনে করি। আমি NMock এবং বিশেষত রাইনোমকস উদাহরণগুলি আরও অভিব্যক্তিপূর্ণ বলে মনে করি।
মোলস (শিমস): স্পষ্ট বলতে গেলে, আমি মোলগুলি পছন্দ করি না, কারণ তাদের অপব্যবহারের সম্ভাবনা রয়েছে। ইউনিট টেস্টিং (এবং বিশেষত টিডিডি) সম্পর্কে আমি যে জিনিসগুলি পছন্দ করি তার মধ্যে একটি হ'ল আপনার কোডটি পরীক্ষা করা আপনাকে বুঝতে পারে যে আপনি কোথায় দুর্বল কোড লিখেছেন। এর কারণ, খারাপভাবে লিখিত কোড পরীক্ষা করা কঠিন। মোলগুলি ব্যবহার করার সময় এটি সত্য নয় কারণ মোলগুলি আসলে আপনাকে ইঞ্জেকশনযুক্ত নয় এমন নির্ভরতাগুলির বিরুদ্ধে পরীক্ষা করতে বা ব্যক্তিগত পদ্ধতি পরীক্ষা করার জন্য ডিজাইন করা হয়। এগুলি স্টাবগুলির মতো একইভাবে কাজ করে, আপনি এই জাতীয় শিমস কনটেক্সট ব্যবহার ব্যতীত:
using (ShimsContext.Create())
{
System.Fakes.ShimDateTime.NowGet = () => { return new DateTime(fixedYear, 1, 1); };
}
শিমসের সাথে আমার উদ্বেগ হ'ল লোকেরা তাদের "ইউনিট পরীক্ষার সহজ উপায়" হিসাবে দেখা শুরু করবে কারণ এটি আপনাকে কোডটি যেমন লিখতে বাধ্য করে না তেমনভাবে। এই ধারণাটি সম্পর্কে আরও সম্পূর্ণ লেখার জন্য আমার এই পোস্টটি দেখুন:
জাল ফ্রেমওয়ার্ক সম্পর্কিত কিছু উদ্বেগ সম্পর্কিত আরও তথ্যের জন্য এই পোস্টগুলি একবার দেখুন:
যদি আপনি রাইনোমকস শিখতে আগ্রহী হন তবে এখানে একটি বহুবর্ণ প্রশিক্ষণের ভিডিও রয়েছে (সম্পূর্ণ প্রকাশ - আমি এই কোর্সটি লিখেছি এবং দর্শনের জন্য বেতন প্রদান করেছি, তবে আমার মনে হয় এটি এই আলোচনায় প্রযোজ্য তাই আমি এটিকে এখানে অন্তর্ভুক্ত করছি):