কোড অভ্যন্তরীণ তৈরি করছে তবে অন্যান্য প্রকল্প থেকে ইউনিট পরীক্ষার জন্য উপলব্ধ


129

আমরা আমাদের সমস্ত ইউনিট পরীক্ষা তাদের নিজস্ব প্রকল্পে রেখেছি। আমরা দেখতে পেয়েছি যে কেবলমাত্র ইউনিট পরীক্ষার জন্য আমাদের অভ্যন্তরীণ পরিবর্তে নির্দিষ্ট ক্লাসগুলি পাবলিক করতে হবে। এটি করতে এড়াতে যাই হোক না কেন। সিল না করে ক্লাসগুলি সর্বজনীন করে স্মৃতি জড়িত কী কী?


উত্তর:


205

আপনি যদি নেট ব্যবহার করে থাকেন তবে ইন্টার্নালভিসিবলিটো অ্যাসেম্বলি অ্যাট্রিবিউট আপনাকে "বন্ধু" সমাবেশগুলি তৈরি করতে দেয়। এগুলি নির্দিষ্টভাবে দৃ named়ভাবে নামযুক্ত অ্যাসেমব্লিগুলিকে অভ্যন্তরীণ ক্লাস এবং অন্যান্য বিধানসভার সদস্যদের অ্যাক্সেসের অনুমতি দেওয়া হয়।

দ্রষ্টব্য, এটি বিচক্ষণতার সাথে ব্যবহার করা উচিত কারণ এটি জড়িত সম্মেলনগুলিকে দৃ .়তার সাথে যুক্ত করে। ইউনিট টেস্টিং প্রকল্পগুলির জন্য ইন্টারনালভিজিবলটো এর একটি সাধারণ ব্যবহার। উপরে বর্ণিত কারণের জন্য এটি সম্ভবত আপনার আসল অ্যাপ্লিকেশন সমাবেশগুলিতে ব্যবহারের জন্য ভাল পছন্দ নয়।

উদাহরণ:

[assembly: InternalsVisibleTo("NameAssemblyYouWantToPermitAccess")]
namespace NameOfYourNameSpace
{

23
আমি গুনটির চারপাশে একটি # আইডিবিউবি রাখার পরামর্শ দেব এবং তারপরে ডিবাগ-এ ইউনিট পরীক্ষার পরামর্শ দেব। এইভাবে আপনি নিশ্চিত হন যে গুণটি প্রকাশের কোডে সেট করা নেই।
স্টিভ কুক

এটি কেবল একটি ধারণা, আমি জানি না .... কীভাবে: # যদি DEBUG পাবলিক ক্লাস IniReader # অন্যান্য অভ্যন্তরীণ ক্লাস IniReader #endif সম্ভবত প্রস্তাবিত নয়? কেন?
জেমেলহস

4
ঠিক আছে, কেন ডিবাগগুলিতে পরীক্ষা সীমাবদ্ধ?
মার্কো এমপি

2
এছাড়াও, কেবল একটি নটপিক, "বন্ধু" অ্যাসেমব্লির জোরালোভাবে নামকরণের প্রয়োজন নেই (এটি একটি ভাল অভ্যাস হতে পারে - এমনকি আমার ব্যক্তিগত স্বাদ অন্যথায় বলে, তবে বাধ্যতামূলক নয়)।
মার্কো এমপি

9
একমত নন। যদি আমি খুব সরু পাবলিক এপিআই দিয়ে একটি জটিল উপাদান তৈরি করে চলেছি তবে এটি কেবলমাত্র পাবলিক এপিআইয়ের মাধ্যমে পরীক্ষা করা অবাস্তব এবং অবাস্তব নয়। আপনি কাদামাটির একটি অপরিমেয় বল দিয়ে শেষ করব। পরিবর্তে, আমি সাবধানে অভ্যন্তরীণ ইউনিটগুলি সংজ্ঞায়িত করব এবং সেগুলি পৃথকভাবে পরীক্ষা করব। যেমনটি জেরেমি ডি মিলার বেশিরভাগ সময় বলেছিলেন: "আপনি বড় টেস্টের আগে ছোট পরীক্ষা করুন"।
ডেনিস ডুমিন

6

এটি যদি কোনও অভ্যন্তরীণ শ্রেণি হয় তবে অবশ্যই এটি বিচ্ছিন্নভাবে ব্যবহৃত হচ্ছে না। অতএব আপনি অভ্যন্তরীণভাবে এই বস্তুর ব্যবহার করে এমন কিছু অন্যান্য শ্রেণির পরীক্ষা করা ছাড়া এটি পরীক্ষা করা উচিত নয়।

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

ধারণাটি হ'ল আপনি কেবলমাত্র একটি শ্রেণীর আচরণ পরীক্ষা করতে চান কারণ আপনি যদি অভ্যন্তরীণ বাস্তবায়নের বিশদটি পরীক্ষা করেন তবে আপনার পরীক্ষাগুলি ভঙ্গুর হবে। আপনার সমস্ত পরীক্ষা না ভেঙে আপনার কোনও শ্রেণির প্রয়োগের বিশদ পরিবর্তন করতে সক্ষম হওয়া উচিত।

যদি আপনি দেখতে পান যে আপনাকে সত্যই class শ্রেণীর পরীক্ষা করা দরকার, তবে আপনি কেন আবার সেই পরীক্ষাটি করতে চান that শ্রেণিটি প্রথম স্থানে কেন অভ্যন্তরীণ।


2
পরিবেশন বিশদ একটি অন্তর্ভুক্ত পরীক্ষার অংশ হিসাবে ব্যবহার করা উচিত। ব্যক্তিগত ভেরিয়েবলগুলিতে উঁকি দিবেন না ... প্রত্যাশিত আচরণটি পরীক্ষা করুন। যদি পরীক্ষাটি ঠিক থাকে .. সমস্ত অংশের অভ্যন্তরীণ নদীর গভীরতানির্ণয় এবং তারের অংশ হিসাবে এটি পরীক্ষা করা উচিত। ভোট দিয়েছেন।
গিশু

69
আমি অগত্যা এটির সাথে একমত নই কারণ এই ক্লাসগুলি ডিএলএল এর ভিতরে অন্য শ্রেণীর কাছে "প্রকাশ্য" এবং ক্লাসের কার্যকারিতা
নির্দ্বিধায়

27
আমিও রাজি নই। ইউনিটগুলি ইউনিট এবং সেগুলি অবশ্যই বিচ্ছিন্নভাবে পরীক্ষা করা উচিত।
সেন্টিনেল

5
দুর্দান্ত জেনারেল গাইডলাইন, তবে আসুন আমরা কৌতুকপূর্ণ না হই। পরীক্ষাগুলি দুটি প্রধান উদ্দেশ্যে পরিবেশন করে: 1) রিগ্রেশন - নিশ্চিত করুন যে আপনি কোনও কিছু ভেঙেছেন না, 2) উন্নয়নের গতি বৃদ্ধি করা। প্রতিবার যদি আমি একটি লাইন কোড লিখতে চাই তবে আমাকে বিশাল পরিষেবাটি দাঁড়াতে হবে তবে আমি উন্নয়নকে বাধাগ্রস্থ করব। আমার যদি একটি জটিল অভ্যন্তরীণ টুকরা থাকে তবে আমি বিকাশ করতে এবং বিচ্ছিন্নভাবে পরীক্ষা করতে সক্ষম হতে চাই। বিপরীতে, আমি বিচ্ছিন্নভাবে সমস্ত কিছু পরীক্ষিত করতে চাই না (এভাবে হ্রাস-পীড়ন পরীক্ষার মান হ্রাস করা, বা পরীক্ষার কোডটিকে নকল করা) তবে কিছু কোড বিচ্ছিন্নতার ন্যায্যতা প্রমাণ করে। সম্ভবত কী এটি একটি পৃথক সমাবেশ করতে।
লি জেনসেন

2
ওপি এখানে সঠিক। আপনি আপনার পরীক্ষাগুলি অভ্যন্তরীণ বাস্তবায়নের সাথে সংযুক্ত করছেন। অতএব আপনার দল চিরকালের জন্য পরীক্ষাগুলি এবং ভয়ঙ্কর উপহাসের কোডটি সংশোধন করার দাস। কেবলমাত্র সর্বজনীন API গুলি পরীক্ষা করুন, সে প্যাকেজড লাইব এপিআই বা নেটওয়ার্ক উন্মুক্ত এপিআই হতে পারে। সামনের দরজা দিয়ে সমস্ত কোড ব্যবহারযোগ্য হতে হবে। পরীক্ষার বাস্তবায়ন কেন টিডিডি বেশিরভাগ ক্ষেত্রে মারা গেছে, সিস্টেমের আচরণের আশ্বাসের প্রতি মনোনিবেশ করার পরিবর্তে পুরো অ্যাপ্লিকেশনটির প্রতিটি শ্রেণীর আক্ষরিক পরীক্ষা করার পক্ষে এটি একটি বিশাল পিআইটিএ। আমি মনে করি "অনুমোদিত" বই সহ প্রায় প্রত্যেকেরই এটির ভুল হয়েছে বা এটি পরিষ্কার করে দেওয়া হয়নি।
লুক পুপলেট

4

ডকুমেন্টেশন উদ্দেশ্যে

বিকল্পভাবে আপনি Type.GetTypeপদ্ধতি ব্যবহার করে অভ্যন্তরীণ ক্লাস ইনস্ট্যান্ট করতে পারেন

উদাহরণ

//IServiceWrapper is public class which is 
//the same assembly with the internal class 
var asm = typeof(IServiceWrapper).Assembly;
//Namespace.ServiceWrapper is internal
var type = asm.GetType("Namespace.ServiceWrapper");
return (IServiceWrapper<T>)Activator
    .CreateInstance(type, new object[1] { /*constructor parameter*/ });

জেনেরিক টাইপের জন্য বেলো হিসাবে বিভিন্ন প্রক্রিয়া রয়েছে:

var asm = typeof(IServiceWrapper).Assembly;
//note the name Namespace.ServiceWrapper`1
//this is for calling Namespace.ServiceWrapper<>
var type = asm.GetType("Namespace.ServiceWrapper`1");
var genType = type.MakeGenericType(new Type[1] { typeof(T) });
return (IServiceWrapper<T>)Activator
     .CreateInstance(genType, new object[1] { /*constructor parameter*/});

-5

ক্লাসগুলি সর্বজনীন এবং সিল করা যেতে পারে।

কিন্তু, এটা করবেন না।

আপনি অভ্যন্তরীণ ক্লাসগুলির উপর প্রতিবিম্বিত করার জন্য একটি সরঞ্জাম তৈরি করতে পারেন এবং একটি নতুন শ্রেণি নির্গত করতে পারেন যা প্রতিচ্ছবিটির মাধ্যমে সমস্ত কিছুতে অ্যাক্সেস করে। এমস্টেস্ট তা করে।

সম্পাদনা: আমি বলতে চাইছি, আপনি যদি নিজের আসল সমাবেশে কোনও পরীক্ষার স্টাফ অন্তর্ভুক্ত করতে না চান; সদস্যরা ব্যক্তিগত হলে এটি কাজ করে।


1
কিসের অপেক্ষা? আপনি বলছেন কি না public sealed class? এই রত্নটির জন্য আপনার যুক্তি কী?
ক্রাশ করুন

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