সি # তে ব্যক্তিগত পদ্ধতিতে ইউনিট পরীক্ষা করা হচ্ছে


291

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

//in project MyProj
class TypeA
{
    private List<TypeB> myList = new List<TypeB>();

    private class TypeB
    {
        public TypeB()
        {
        }
    }

    public TypeA()
    {
    }

    private void MyFunc()
    {
        //processing of myList that changes state of instance
    }
}    

//in project TestMyProj           
public void MyFuncTest()
{
    TypeA_Accessor target = new TypeA_Accessor();
    //following line is the one that throws exception
    target.myList.Add(new TypeA_Accessor.TypeB());
    target.MyFunc();

    //check changed state of target
}

রানটাইম ত্রুটিটি হ'ল:

Object of type System.Collections.Generic.List`1[MyProj.TypeA.TypeA_Accessor+TypeB]' cannot be converted to type 'System.Collections.Generic.List`1[MyProj.TypeA.TypeA+TypeB]'.

ইন্টেলিজেন্স অনুসারে - এবং তাই আমি সংকলকটি অনুমান করি - লক্ষ্য টাইপ টাইপএ_এ্যাকসেসরের। তবে রানটাইমের সময় এটি টাইপ এ টাইপ করে এবং তাই তালিকার যোগে ব্যর্থ হয়।

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


আপনার প্রাইভেট ক্লাস টাইপবি এর জন্য একটি অ্যাক্সেসর দরকার। অ্যাকসেসর টাইপএ_এ্যাকসেসর টাইপএর ব্যক্তিগত এবং সুরক্ষিত পদ্ধতিতে অ্যাক্সেস সরবরাহ করে। তবে টাইপবি কোনও পদ্ধতি নয়। এটি একটি ক্লাস।
দিমা

অ্যাক্সেসর ব্যক্তিগত / সুরক্ষিত পদ্ধতি, সদস্য, বৈশিষ্ট্য এবং ইভেন্টগুলিতে অ্যাক্সেস সরবরাহ করে। এটি আপনার ক্লাসের মধ্যে ব্যক্তিগত / সুরক্ষিত শ্রেণিতে অ্যাক্সেস সরবরাহ করে না। এবং ব্যক্তিগত / সুরক্ষিত ক্লাসগুলি (টাইপবি) কেবল শ্রেণীর (টাইপএ) মালিকানার পদ্ধতি দ্বারা ব্যবহার করার উদ্দেশ্যে। সুতরাং মূলত আপনি টাইপএর বাইরে থেকে ব্যক্তিগত ক্লাস (টাইপবি) প্রাইভেট যা "মাইলিস্ট" এ যুক্ত করার চেষ্টা করছেন। আপনি যেহেতু অ্যাক্সেসর ব্যবহার করছেন তাই মাইলিস্ট অ্যাক্সেস করতে কোনও সমস্যা নেই। তবে আপনি অ্যাকসেসরের মাধ্যমে টাইপবি ব্যবহার করতে পারবেন না। টাইপবি'র বাইরে টাইপবি স্থানান্তরিত করার সম্ভাব্য সমাধান হ'ল। তবে এটি আপনার নকশাটি ভেঙে দিতে পারে।
দিমা

মনে করেন যে ব্যক্তিগত পদ্ধতি পরীক্ষা অনুসরণ করে কাজ করা উচিত stackoverflow.com/questions/250692/...
nate_weldon

উত্তর:


274

হ্যাঁ, ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করবেন না .... ইউনিট পরীক্ষার ধারণাটি ইউনিটটিকে তার সর্বজনীন 'এপিআই' দ্বারা পরীক্ষা করা।

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

এক টুকরো পরামর্শ / চিন্তাভাবনা সরঞ্জাম ..... একটি ধারণা রয়েছে যে কোনও পদ্ধতিই ব্যক্তিগত না হওয়া উচিত। অর্থ সমস্ত পদ্ধতির কোনও অবজেক্টের সার্বজনীন ইন্টারফেসে থাকা উচিত .... যদি আপনি মনে করেন যে আপনার এটিকে ব্যক্তিগত করা প্রয়োজন, সম্ভবত এটি অন্য কোনও বস্তুর উপরে থাকে।

এই পরামর্শের অংশটি বাস্তবে কার্যকরভাবে কার্যকর হয় না, তবে এটি বেশিরভাগই ভাল পরামর্শ এবং প্রায়শই এটি লোককে তাদের বস্তুগুলিকে ছোট ছোট বস্তুগুলিতে ক্ষয় করতে চাপ দেয়।


384
আমি একমত নই ওওডিতে, ব্যক্তিগত পদ্ধতি এবং বৈশিষ্ট্যগুলি নিজেকে পুনরাবৃত্তি না করার একটি অন্তর্নিহিত উপায় ( en.wikedia.org/wiki/Don%27t_repeat_yourself )। ব্ল্যাক বক্স প্রোগ্রামিং এবং এনক্যাপসুলেশনের পিছনে ধারণাটি গ্রাহকের কাছ থেকে প্রযুক্তিগত বিবরণ আড়াল করা। সুতরাং আপনার কোডটিতে অপ্রয়োজনীয় ব্যক্তিগত পদ্ধতি এবং বৈশিষ্ট্যগুলি থাকা সত্যই প্রয়োজন। এবং যদি এটি অপ্রয়োজনীয় হয় তবে এটি পরীক্ষা করা দরকার।
AxD

8
এটি স্বতন্ত্র নয়, কয়েকটি ওও ভাষাগুলিতে ব্যক্তিগত পদ্ধতি নেই, ব্যক্তিগত সম্পত্তিগুলিতে পাবলিক ইন্টারফেসের সাথে অবজেক্ট থাকতে পারে যা পরীক্ষা করা যেতে পারে।
কীথ নিকোলাস

7
এই পরামর্শের মূল বিষয়টি হ'ল যদি আপনি নিজের অবজেক্টটি একটি কাজ করেন, এবং এটি DRY হন, তবে ব্যক্তিগত উপায় থাকার প্রায়শই খুব কম কারণ থাকে। প্রায়শই ব্যক্তিগত পদ্ধতি এমন কিছু করে যা বস্তুটির জন্য সত্যই দায়বদ্ধ নয় তবে এটি বেশ কার্যকর, যদি তুচ্ছ না হয় তবে সাধারণত এটি সম্ভবত অন্য একটি বিষয় যা এর সম্ভাব্য লঙ্ঘনকারী এসআরপি
কেথ নিকোলাস

28
ভুল। কোডের সদৃশতা এড়াতে আপনি ব্যক্তিগত পদ্ধতিগুলি ব্যবহার করতে চাইতে পারেন। বা বৈধতা জন্য। বা অন্য অনেকগুলি উদ্দেশ্যে যা পাবলিক ওয়ার্ল্ড সম্পর্কে জানা উচিত নয়।
জর্জ

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

666

আপনি বেসরকারী ক্লাস ব্যবহার করতে পারেন

Class target = new Class();
PrivateObject obj = new PrivateObject(target);
var retVal = obj.Invoke("PrivateMethod");
Assert.AreEqual(expectedVal, retVal);

25
এটি সঠিক উত্তর, এখন মাইক্রোসফ্ট প্রাইভেটওবজেক্ট যুক্ত করেছে।
জোয়ি

4
উত্তম উত্তর তবে দয়া করে নোট করুন যে "ব্যক্তিগত" এর পরিবর্তে প্রাইভেটমেথোদকে "সুরক্ষিত" করা দরকার।
হার্বালমার্ট

23
@ হার্বালমার্ট: সম্ভবত আমি আপনাকে ভুল বুঝাবুঝি, তবে আপনি যদি পরামর্শ দিচ্ছেন যে প্রাইভেটঅবজেক্ট কেবল সুরক্ষিত সদস্যদেরই অ্যাক্সেস করতে পারে তবে ব্যক্তিগত সদস্য নয়, আপনি ভুল করছেন।
কিমিওট

17
@ জেফপিয়ার স্ট্যাটিক পদ্ধতির জন্য আপনি "প্রাইভেট টাইপ পিটি = নতুন প্রাইভেট টাইপ (টাইপফ (মাইক্লাস)) ব্যবহার করতে পারেন;" এবং তারপরে পিটি অবজেক্টে ইনভোকস্ট্যাটিককে কল করুন যেহেতু আপনি কোনও ব্যক্তিগত অবজেক্টে ইনভোককে ডাকবেন call
স্টিভ হাইবার্ট

12
যদি কেউ MSTest.TestFramework v1.2.1 হিসাবে হতাশ ছিল - PrivateObject এবং PrivateType শ্রেণীর .NET কোর 2.0 লক্ষ্য করে প্রকল্পগুলির জন্য অনুপলব্ধ - এই জন্য একটি GitHub ইস্যু আছে: github.com/Microsoft/testfx/issues/366
shiitake

98

"এখানে স্ট্যান্ডার্ড বা সেরা অনুশীলন বলে কিছু নেই, সম্ভবত তারা কেবল জনপ্রিয় মতামত"।

একইভাবে এই আলোচনার ক্ষেত্রে সত্য।

এখানে চিত্র বর্ণনা লিখুন

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

আপনি যদি ব্যক্তিগত পদ্ধতিগুলি চালু করতে চান তবে আপনি "প্রাইভেটঅবজেক্ট" শ্রেণিটি ব্যবহার করতে পারেন এবং আহবান পদ্ধতিতে কল করতে পারেন। আপনি এই ইন্ডিপথ ইউটিউব ভিডিওটি দেখতে পারেন ( http://www.youtube.com/watch?v=Vq6Gcs9LrPQ ) যা "প্রাইভেটওবজেক্ট" কীভাবে ব্যবহার করতে হয় তা দেখায় এবং ব্যক্তিগত পদ্ধতিগুলির পরীক্ষা করা যৌক্তিক কিনা তাও আলোচনা করে।


55

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

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

[assembly: InternalsVisibleTo("MyCode.UnitTests")]
namespace MyCode.MyWatch
{
    #pragma warning disable CS0628 //invalid because of InternalsVisibleTo
    public sealed class MyWatch
    {
        Func<DateTime> _getNow = delegate () { return DateTime.Now; };


       //construktor for testing purposes where you "can change DateTime.Now"
       internal protected MyWatch(Func<DateTime> getNow)
       {
           _getNow = getNow;
       }

       public MyWatch()
       {            
       }
   }
}

এবং ইউনিট পরীক্ষা:

namespace MyCode.UnitTests
{

[TestMethod]
public void TestminuteChanged()
{
    //watch for traviling in time
    DateTime baseTime = DateTime.Now;
    DateTime nowforTesting = baseTime;
    Func<DateTime> _getNowForTesting = delegate () { return nowforTesting; };

    MyWatch myWatch= new MyWatch(_getNowForTesting );
    nowforTesting = baseTime.AddMinute(1); //skip minute
    //TODO check myWatch
}

[TestMethod]
public void TestStabilityOnFebruary29()
{
    Func<DateTime> _getNowForTesting = delegate () { return new DateTime(2024, 2, 29); };
    MyWatch myWatch= new MyWatch(_getNowForTesting );
    //component does not crash in overlap year
}
}

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

2
হ্যাঁ, আমি এটাই পরামর্শ দিচ্ছি। এটি কিছুটা "হ্যাকি" তবে কমপক্ষে তারা "পাবলিক" নন।
জেফ

27
এটি একটি বিস্ময়কর উত্তর শুধু কারণ এটি বলে না "ব্যক্তিগত পদ্ধতি পরীক্ষা না" তবে হ্যাঁ, এটা বেশ "হল hacky" আছে। আমি আশা করি এর কোন সমাধান হত। আইএমও এটি "ব্যক্তিগত পদ্ধতি পরীক্ষা করা উচিত নয়" বলা খারাপ কারণ আমি যেভাবে দেখছি: এটি "ব্যক্তিগত পদ্ধতি সঠিক হওয়া উচিত নয়" এর সমতুল্য।
মাস্টারমাস্টিক

5
হ্যাঁ, আমি এমন ব্যক্তিরাও বিভ্রান্ত হয়েছি যারা দাবি করেন যে ব্যক্তিগত পদ্ধতিগুলি ইউনিট পরীক্ষায় পরীক্ষা করা উচিত নয়। সর্বজনীন এপিআই আউটপুট, তবে কখনও কখনও ভুল বাস্তবায়নও সঠিক আউটপুট দেয়। বা বাস্তবায়ন কিছু খারাপ পার্শ্ব প্রতিক্রিয়া তৈরি করেছে, যেমন প্রয়োজনীয় সংস্থানগুলি হোল্ডিংগুলি, জিসি দ্বারা সংগ্রহ করা থেকে বাধা দেয় এমন বিষয়গুলিকে রেফারেন্স করে ... ইত্যাদি। যদি না তারা ইউনিট পরীক্ষার চেয়ে ব্যক্তিগত পদ্ধতিগুলি কভার করতে পারে এমন অন্যান্য পরীক্ষা সরবরাহ না করে আমি তা বিবেচনা করব যে তারা 100% পরীক্ষিত কোড বজায় রাখতে পারে না।
মিঃপনি

আমি মাস্টারমাস্টিকের সাথে একমত এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
এক্সডিএস

27

ব্যক্তিগত পদ্ধতি পরীক্ষা করার একটি উপায় প্রতিবিম্বের মাধ্যমে। এটি NUnit এবং XUnit এর ক্ষেত্রেও প্রযোজ্য:

MyObject objUnderTest = new MyObject();
MethodInfo methodInfo = typeof(MyObject).GetMethod("SomePrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
object[] parameters = {"parameters here"};
methodInfo.Invoke(objUnderTest, parameters);

call methods স্থির এবং অ স্থির ?
কিকিনেট

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

2
@ এক্সডিএস খুব খারাপ নাম () এর শ্রেণীর বাইরে থেকে কোনও ব্যক্তিগত পদ্ধতির নাম আনতে কাজ করে না।
গ্যাব্রিয়েল মরিন

12

এর্মহ ... ঠিক একই সমস্যাটি নিয়ে এখানে এসেছেন: একটি সাধারণ , তবে মূল বেসরকারী পদ্ধতিটি পরীক্ষা করুন। এই থ্রেডটি পড়ার পরে, এটি "মেটালটির এই সাধারণ টুকরোটিতে আমি এই সাধারণ গর্তটি ড্রিল করতে চাই এবং এটির মানটি চশমাগুলি পূরণ করে" তা নিশ্চিত করতে চাই বলে মনে হয় এবং তারপরে "ঠিক আছে, এটি সহজ নয়। প্রথমত, এটি করার উপযুক্ত কোনও সরঞ্জাম নেই তবে আপনি আপনার বাগানে একটি মহাকর্ষ-তরঙ্গ সংরক্ষণাগার তৈরি করতে পারেন http : // http://foobar.brigther-than-einstein.org/ এ আমার নিবন্ধটি পড়ুন প্রথমত, অবশ্যই, আপনি কিছু উন্নত কোয়ান্টাম পদার্থবিজ্ঞানের কোর্সে অংশ নিতে হবে, তারপরে আপনার দরকার প্রচুর পরিমাণে আল্ট্রা-কুল নাইট্রোজেনিয়াম এবং তারপরে অবশ্যই আমার বইটি অ্যামাজনে পাওয়া যায় "...

অন্য কথায় ...

না, প্রথম জিনিস।

প্রতিটি এবং প্রতিটি পদ্ধতি, এটি ব্যক্তিগত, অভ্যন্তরীণ, সুরক্ষিত, জনসাধারণের কাছে থাকতে পারে testable যাবে। এখানে উপস্থাপিত যেমন অ্যাডো ছাড়াই এই জাতীয় পরীক্ষার বাস্তবায়নের একটি উপায় থাকতে হবে।

কেন? ঠিক কারণ কিছু অবদানকারীর দ্বারা এখনও পর্যন্ত নির্মাণকাজের উল্লেখগুলির । সফ্টওয়্যার নীতিগুলির একটি সাধারণ পুনরাবৃত্তি কিছু ভুলত্রুটি পরিষ্কার করতে পারে।

এই ক্ষেত্রে, সাধারণ সন্দেহভাজনরা হলেন: ওসিপি, এসআরপি এবং সর্বদা, কেআইএস।

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

আমি কি সম্পর্কে কথা বলছি?

বেসরকারী ডাবল ট্রান্সলেশনমেজারমেন্ট ইনটোলাইনার (ডাবল রিয়েল ম্যাসেজমেন্ট);

কুম্ভের যুগ বা আজকাল যা বলা হয় এটি সহজেই প্রচার করা সহজ তবে যদি আমার সেন্সরটির অংশটি ১.০ থেকে ২.০ পর্যন্ত হয় তবে অনুবাদটির বাস্তবায়ন ... একটি সাধারণ রৈখিক সমীকরণ হতে পারে যা সহজেই বোধগম্য এবং "পুনরায়- প্রত্যেকের জন্য ব্যবহারযোগ্য "একটি দুর্দান্ত পরিসংখ্যান যা বিশ্লেষণ বা যা কিছু ব্যবহার করে এবং তাই আমি অন্যের কোডটি ভেঙে দেব। কেন? কারণ তারা সফটওয়্যার কোডিংয়ের খুব সম্ভাবনা বুঝতে পারে না, এমনকি কেআইএসও নয়।

রূপকথার এই গল্পটি ছোট করার জন্য: আমাদের একটি সরল প্রয়োজন অ্যাডোও ছাড়াই ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করার উপায় ।

প্রথম: শুভ নববর্ষ সবাই!

দ্বিতীয়: আপনার স্থপতি পাঠের মহড়া দিন।

তৃতীয়: "জনসাধারণ" সংশোধক হ'ল ধর্ম, সমাধান নয়।


5

অন্য একটি বিকল্প যা উল্লেখ করা হয়নি তা হ'ল আপনি পরীক্ষা করছেন এমন অবজেক্টের শিশু হিসাবে ইউনিট পরীক্ষার শ্রেণি তৈরি করা। নুন উদাহরণ:

[TestFixture]
public class UnitTests : ObjectWithPrivateMethods
{
    [Test]
    public void TestSomeProtectedMethod()
    {
        Assert.IsTrue(this.SomeProtectedMethod() == true, "Failed test, result false");
    }
}

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

যাহোক...

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

আমি এই পদ্ধতির উল্লেখ করার সময়, আমি পরামর্শ দেব যে এটি একটি বৈধ সমাধানের চেয়ে মস্তিস্কযুক্ত পরামর্শ of নুনের দানা দিয়ে এটি নিন।

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


এটি একটি সৃজনশীল সমাধান তবে কিন্ডা হ্যাকি।
shinzou

1
শিনজৌ অসম্মতি জানান, এর সুপার হ্যাকি ..... ;-)
রজার হিল

3

লিগ্যাসি কোড সহ কার্যকরভাবে কাজ করা বইটি থেকে :

"আমাদের যদি কোনও বেসরকারী পদ্ধতি পরীক্ষা করার দরকার হয় তবে আমাদের এটিকে জনসাধারণের করা উচিত If

লেখকের মতে এটি ঠিক করার উপায়টি হল একটি নতুন ক্লাস তৈরি করা এবং পদ্ধতিটি যুক্ত করা public

লেখক আরও ব্যাখ্যা করেছেন:

"ভাল নকশা পরীক্ষাযোগ্য এবং ডিজাইনের যা পরীক্ষামূলক হয় না এটি খারাপ।"

সুতরাং, এই সীমাগুলির মধ্যে, আপনার একমাত্র আসল বিকল্পটি publicবর্তমান বা নতুন ক্লাসে পদ্ধতিটি তৈরি করা ।


2

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

দেখে মনে হচ্ছে আপনার privateঅন্য একটি ক্লাসে পদ্ধতিতে এক্সট্র্যাক্ট প্রয়োজন ; এই হতে হবে publicprivateপদ্ধতিটি পরীক্ষা করার চেষ্টা করার পরিবর্তে আপনার পরীক্ষা করা উচিতpublic এই অন্য শ্রেণির পদ্ধতিটি ।

আমাদের নিম্নলিখিত পরিস্থিতিতে রয়েছে:

Class A
+ outputFile: Stream
- _someLogic(arg1, arg2) 

আমাদের যুক্তি পরীক্ষা করা দরকার _someLogic; তবে মনে হয় এটির Class Aচেয়ে বেশি ভূমিকা নিন (এসআরপি নীতি লঙ্ঘন); কেবল দুটি ক্লাসে রিফ্যাক্টর

Class A1
    + A1(logicHandler: A2) # take A2 for handle logic
    + outputFile: Stream
Class A2
    + someLogic(arg1, arg2) 

এইভাবে someLogicএ 2 তে পরীক্ষা করা যেতে পারে; এ 1-তে কিছু জাল A2 তৈরি করুন তারপরে কনস্ট্রাক্টরকে ইনজেকশনের জন্য পরীক্ষা করুন যে A2 নামক ফাংশনে ডাকা হয় someLogic


0

ভিএস ২০০৫/২০০৮ এ আপনি ব্যক্তিগত সদস্যের পরীক্ষার জন্য প্রাইভেট অ্যাক্সেসর ব্যবহার করতে পারেন , তবে এই ভাবে ভিএস-র পরবর্তী সংস্করণে অদৃশ্য হয়ে গেল


1
২০০৮ সালে সম্ভবত ২০১০ এর প্রথম দিকে ভাল উত্তর ফিরে আসুন Now এখন দয়া করে প্রাইভেটবজেক্ট এবং রিফ্লেকশন বিকল্পগুলি দেখুন (উপরে বেশ কয়েকটি উত্তর দেখুন)। ভিএস2010 এর অ্যাক্সেসর বাগ (গুলি) ছিল, এমএস এটি ভিএস ২০১২ এ অবমূল্যায়ন করেছে। আপনি ভিএস 2010 বা ততোধিক বয়সী (> 18 বছর বয়সী বিল্ড টুলিং) এ থাকতে বাধ্য না হলে দয়া করে ব্যক্তিগত অ্যাক্সেসরগুলি এড়িয়ে নিজের সময় বাঁচান। :-)।
জাফান শ্রয়েডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.