ভিএস ২০১7। নেট স্ট্যান্ডার্ড লাইব্রেরিতে অভ্যন্তরীণ পদ্ধতিগুলির ইউনিট পরীক্ষা করা


150

আমি বর্তমানে একটি নেট স্ট্যান্ডার্ড 1.6 লাইব্রেরি তৈরি করে সর্বশেষতম ভিজ্যুয়াল স্টুডিও 2017 রিলিজ প্রার্থীর সাথে ঘুরে বেড়াচ্ছি। আমি আমার কোডটি পরীক্ষা করার জন্য xUnit ব্যবহার করছি এবং ভাবছিলাম যে আপনি এখনও ভিএস2017 এ অভ্যন্তরীণ পদ্ধতিগুলি পরীক্ষা করতে পারেন কিনা।

আমার মনে আছে আপনি ভিএস ২০১৫ এর সমস্ত লাইন এসেম্বলিআইএন.পি. ক্লাস করতে পারতেন যা নির্দিষ্ট প্রকল্পগুলিকে অভ্যন্তরীণ পদ্ধতিগুলি দেখতে সক্ষম করবে

[assembly:InternalsVisibleTo("MyTests")]

যেহেতু ভিএস ২০১7-তে কোনও এসেম্বলিআইএনফোস ক্লাস নেই। নেট স্ট্যান্ডার্ড প্রকল্পগুলি আমি ভাবছিলাম যে আপনি এখনও অভ্যন্তরীণ পদ্ধতিতে পরীক্ষা করতে পারবেন?


3
আপনি উচিত একা বহিরাগত-প্রোফাইল কার্যকারিতা থেকে আপনার কোড ইউনিট পরীক্ষা করতে সক্ষম হবেন। সর্বোপরি, যদি বাহ্যিক কোড থেকে কোনও যৌক্তিক পথ সেই অভ্যন্তরীণ পদ্ধতিতে পৌঁছতে না পারে তবে তারা সেখানে প্রথম স্থানে কী করবে?
ডেভিড

3
@ ডেভিড আমি এটি করতে পারি এবং করতে পেরেছি তবে এর আগে কিছু অভ্যন্তরীণ ক্লাসের আশেপাশে আমি সাধারণ ইউনিট পরীক্ষা করেছি। কেবল পরীক্ষায় আরও স্পষ্ট হতে হবে।
ফিল মারে

5
আফাইক, আপনি এই বৈশিষ্ট্যটি namespaceব্লকের বাইরে অন্য কোনও ফাইলে রাখতে পারেন এবং এটি সংকলন করা উচিত। জাদুকরী কিছু থাকতে হবে না AssemblyInfo.cs। এটা কি কাজ করে না? অবশ্যই, আপনাকে সঠিক usingধারাটি যুক্ত করতে হবে বা পুরোপুরি যোগ্যতাসম্পন্ন গুণাবলী ব্যবহার করতে হবে [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("Something")]
গ্রু

1
@David আপনি অভ্যন্তরীণ শ্রেণীর সঙ্গে একটি লাইব্রেরি তৈরি হয় এবং আপনি পরীক্ষা করতে হবে এবং এই শ্রেণীর বিদ্রুপ করে InternalsVisibleToযেমন এখানে - - সমালোচনামূলক stackoverflow.com/a/17574183/43453
PandaWood

উত্তর:


210

.NET ডক্সInternalsVisibleToAttribute অনুসারে :

বৈশিষ্ট্যটি সমাবেশ স্তরে প্রয়োগ করা হয়। এর অর্থ এটি একটি উত্স কোড ফাইলের শুরুতে অন্তর্ভুক্ত করা যেতে পারে, বা এটি ভিজ্যুয়াল স্টুডিও প্রকল্পে એસেম্বলিআইএনফো ফাইলটিতে অন্তর্ভুক্ত করা যেতে পারে।

অন্য কথায়, আপনি কেবল এটি নিজের নিজের ইচ্ছামত নামে .cs ফাইলের মধ্যে স্থাপন করতে পারেন এবং এটি ঠিকঠাক কাজ করা উচিত:

// some .cs file included in your project
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]

1
@PhilMurray: এছাড়াও, মনে একটি সেটিং যে আপনি একটি "ক্লাসিক" তৈরি অনুমতি থাকবে নেই AssemblyInfo.csমত ব্যাখ্যা ফাইল এখানে । অন্যথায় সমস্ত বিবরণ যেমন "বর্ণনা", "কপিরাইট" এবং অন্যান্য স্টাফগুলি .csproj ফাইলের মধ্যে সঞ্চয় হয়ে যায়।
গ্রো

43

এখানে বর্ণিত হিসাবে:

https://blog.sanderaernouts.com/make-internals-visible-with-new-csproj-format

অন্য আইটেমগ্রুপ যুক্ত করে প্রকল্পের ফাইলের অভ্যন্তরীণ দৃশ্যমান বৈশিষ্ট্য যুক্ত করা সম্ভব:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(AssemblyName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

অথবা এমনকি:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

আমি সেই সমাধানটি পছন্দ করি কারণ এই জাতীয় উদ্বেগ সংজ্ঞায়নের জন্য প্রকল্প ফাইলটি সঠিক জায়গা বলে মনে হচ্ছে।


8

যদিও প্রথম উত্তরটি পুরোপুরি ঠিক আছে। আপনি যদি মনে করেন আপনি এখনও এটি আসলটিতে AssemblyInfoকরতে চান তবে আপনি সর্বদা ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন না করা এবং ম্যানুয়ালি এটি যুক্ত করতে বেছে নিতে পারেন।

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

আরও তথ্যের জন্য: https://stackoverflow.com/a/47075759/869033


5

"ইন্টার্নালভিজিবলটো" বৈশিষ্ট্যটি নেট। র জন্য পরীক্ষার যে কোনও ধরণের "হোয়াইট-বাক্স" (দশকের শব্দটি, আমি অনুমান করি) এর চাবিকাঠি key এটি সম্মুখের "সমাবেশ" বৈশিষ্ট্য সহ যে কোনও সি # ফাইলে স্থাপন করা যেতে পারে। নোট করুন যে এমএস ডোকস বলেছেন যে সমাবেশের নামটি অবশ্যই স্বাক্ষরিত হলে জনসাধারণের কী টোকেন দ্বারা যোগ্য হতে হবে। কখনও কখনও এটি কাজ করে না এবং একটিকে অবশ্যই তার স্থানে সম্পূর্ণ পাবলিক কীটি ব্যবহার করতে হবে। ইন্টারনালগুলিতে অ্যাক্সেস সমবর্তী সিস্টেমগুলি পরীক্ষা করার এবং অন্যান্য অনেক পরিস্থিতিতে চাবিকাঠি। Https://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 দেখুন । এই বইতে, মেসারোস বিভিন্ন কোডিং শৈলীর বর্ণনা দিয়েছেন যা মূলত প্রোগ্রাম বিকাশের জন্য "টেস্টের জন্য ডিজাইন" পদ্ধতির গঠন করে। কমপক্ষে আমি বছরের পর বছর ধরে এটি ব্যবহার করেছি।

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


1

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

আপনি আপনার টার্গেট প্রকল্পে একটি পরীক্ষার হুক শিপিংয়ের কাজ শেষ করার পরে এটি 'আদর্শ' নয়। তবে ডায়গনিস্টিক বন্দরগুলির সাথে আধুনিক নির্ভরযোগ্য গাড়ি জাহাজ এবং একটি জেটিএইচ সংযোগ সহ আধুনিক নির্ভরযোগ্য ইলেকট্রনিক্স শিপ বিবেচনা করুন। তবে ডায়াগনস্টিক পোর্টটি ব্যবহার করে কেউ তাদের গাড়ি চালানোর পক্ষে যথেষ্ট বোকা।

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