ASP.NET MVC- এ নিয়ামক পরীক্ষার ইউনিটটির কি কোনও বাস্তব মূল্য আছে?


33

আমি আশা করি এই প্রশ্নটি কিছু আকর্ষণীয় উত্তর দেয় কারণ এটি এমন একটি যা আমাকে কিছুক্ষণের জন্য ডেকে আনে।

ASP.NET MVC- এ নিয়ামক পরীক্ষার ইউনিটটির কি কোনও বাস্তব মূল্য আছে?

এর দ্বারা আমি যা বোঝাতে চাইছি তা হ'ল বেশিরভাগ সময়, (এবং আমি কোনও বুদ্ধিমান নই), আমার নিয়ামক পদ্ধতিগুলি এমনকি তাদের সবচেয়ে জটিল কিছুতে:

public ActionResult Create(MyModel model)
{
    // start error list
    var errors = new List<string>();

    // check model state based on data annotations
    if(ModelState.IsValid)
    {
        // call a service method
        if(this._myService.CreateNew(model, Request.UserHostAddress, ref errors))
        {
            // all is well, data is saved, 
            // so tell the user they are brilliant
            return View("_Success");
        }
    }

    // add errors to model state
    errors.ForEach(e => ModelState.AddModelError("", e));

    // return view
    return View(model);
}

বেশিরভাগ ভারী-উত্তোলন এমভিসি পাইপলাইন বা আমার পরিষেবা লাইব্রেরি দ্বারা হয়।

তাই হয়ত জিজ্ঞাসা করা প্রশ্নগুলি হতে পারে:

  • এই পদ্ধতির পরীক্ষার ইউনিটের মূল্য কী হবে?
  • এটি কি একটি নালারফেরান এক্সেপশন Request.UserHostAddressএবং এর ModelStateসাথে ভেঙে যাবে না ? আমি কি এগুলি উপহাস করার চেষ্টা করব?
  • যদি আমি এই পদ্ধতিটিকে পুনরায় ব্যবহারযোগ্য "সহায়ক" হিসাবে প্রতিবিম্বিত করি (যা আমি সম্ভবত কতবার করব তা বিবেচনা করে দেখি!), এটি পরীক্ষা করাও উপযুক্ত হবে যখন আমি সত্যিই পরীক্ষিত সমস্তই বেশিরভাগ "পাইপলাইন" যা, সম্ভবত, মাইক্রোসফ্ট দ্বারা জীবনের এক ইঞ্চি মধ্যে পরীক্ষা করা হয়েছে?

আমি মনে করি আমার বক্তব্য সত্যই , নিম্নলিখিতগুলি করা একেবারে অর্থহীন এবং ভুল বলে মনে হচ্ছে

[TestMethod]
public void Test_Home_Index()
{
    var controller = new HomeController();
    var expected = "Index";
    var actual = ((ViewResult)controller.Index()).ViewName;
    Assert.AreEqual(expected, actual);
}

স্পষ্টতই আমি এই অতিরঞ্জনীয় অর্থহীন উদাহরণটি সহকারে অবস্হায় আছি, তবে এখানে কারও কি যুক্তি যুক্তি আছে?

এটির অপেক্ষায় ... ধন্যবাদ


আমি মনে করি যে সেই নির্দিষ্ট পরীক্ষায় রই (বিনিয়োগের উপর রিটার্ন) প্রচেষ্টার পক্ষে মূল্যবান নয়, যদি না আপনার কাছে অসীম সময় এবং অর্থ থাকে। আমি কেভিন যেসব জিনিস ভাঙ্গার সম্ভাবনা বেশি তা পরীক্ষা করার জন্য নির্দেশ করে এমন পরীক্ষাগুলি লিখব যা আত্মবিশ্বাসের সাথে কোনও কিছুর সংশোধন করতে বা প্রত্যাশা অনুযায়ী ত্রুটির প্রচার ঘটছে তা নিশ্চিত করতে আপনাকে সহায়তা করবে। প্রয়োজনে পাইপলাইন পরীক্ষা আরও বিশ্বব্যাপী / অবকাঠামো পর্যায়ে করা যেতে পারে এবং পৃথক পদ্ধতিতে স্তরের স্বল্প মূল্য হবে না। এগুলি বলছে না যে তাদের কোনও মূল্য নেই, তবে "সামান্য"। সুতরাং এটি যদি আপনার ক্ষেত্রে ভাল রোয় সরবরাহ করে তবে এর জন্য যান, অন্যথায়, প্রথমে বড় মাছটি ধরুন!
মিঃচিফ

উত্তর:


18

এমনকি এত সাধারণ কিছু জন্য, একটি ইউনিট পরীক্ষা একাধিক উদ্দেশ্যে পরিবেশন করা হবে

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

এই নির্দিষ্ট ক্রিয়াটির জন্য আমি নিম্নলিখিতগুলির জন্য পরীক্ষা করে যাচ্ছি

  1. _মাই সার্ভিস নਾਲ হলে কী হয়?
  2. _মাই সার্ভিস.ক্রিয়েট যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলে, তবে কী ঘটে?
  3. একটি সফল _myService.Create কি _সেসেস ভিউ ফেরত দেয়?
  4. মডেলস্টেট পর্যন্ত ত্রুটিগুলি প্রচারিত হয়?

আপনি নুলারফেরান এক্সেপশনটির জন্য অনুরোধ এবং মডেলটি পরীক্ষা করে দেখিয়েছেন এবং আমি মনে করি যে মডেলস্টেট.আইএসভিডেল মডেলের জন্য নালরফেরেন্স পরিচালনা করার যত্ন নেবে।

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


হাই কেভিন, উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ। আমি এটিকে কিছুক্ষণ রেখে যাব কিনা দেখার জন্য যে অন্য কারও সাথে আসে কিনা তবে এখন পর্যন্ত আপনারাই সবচেয়ে যুক্তিযুক্ত / পরিষ্কার।
লিভারপুলস

Spifty। খুশী হ'ল আপনাকে সাহায্য করেছে।
কেভিন

3

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

  • HTTP ক্যোয়ারী স্ট্রিং, ফর্মের মান ইত্যাদি থেকে মডেল তৈরি করুন
  • কিছু প্রাথমিক বৈধতা সম্পাদন করুন
  • আমার ডেটা বা ব্যবসায়ের স্তরটিতে কল করুন
  • উত্পন্ন a ActionResult

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

এমনকি পরীক্ষা করার মতো খুব সামান্য হলেও আমি এখনও এগুলি লিখি। মূলত, আমি পরীক্ষা করে দেখি যে আমার সংগ্রহস্থলগুলি ডাকা হয়েছে এবং সঠিক ActionResultটাইপটি ফিরে এসেছে। ViewResultসঠিক দৃশ্যের পথটি ফিরে এসেছে এবং ভিউ মডেলটি যেভাবে প্রত্যাশা করেছিলাম সেভাবে দেখায় তা নিশ্চিত করার জন্য আমার কাছে একটি সুবিধার পদ্ধতি রয়েছে । ডান কন্ট্রোলার / অ্যাকশন সেট করার জন্য আমার আরও একটি আছে RedirectToActionResultJsonResultইত্যাদির জন্য আমার অন্যান্য পরীক্ষা আছে etc.

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

এটি যথেষ্ট পরিশ্রমী লাগে, তবে আমি মনে করি এটি মূল্যবান।


উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ তবে সরাসরি 2 টি সমস্যা। প্রথমত, ইউনিট পরীক্ষায় "সহায়তাকারী পদ্ধতি" v.danजर। দ্বিতীয়ত, "পরীক্ষা করে যে আমার সংগ্রহস্থলগুলি বলা হয়" - আপনি কি নির্ভরতা ইনজেকশনের মাধ্যমে বোঝাতে চান?
লিভারপুলস

সুবিধাপ্রাপ্ত পদ্ধতি কেন বিপজ্জনক হবে? আমার একটা BaseControllerTestsক্লাস আছে যেখানে তারা সবাই থাকে। আমি আমার ভাণ্ডারগুলিকে উপহাস করি। আমি এগুলিকে নিনজেক্ট ব্যবহার করার জন্য প্লাগ করেছি।
ট্র্যাভিস পার্কগুলি

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

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

ঠিক আছে, যথেষ্ট - আপনি "আমার সংগ্রহশালাটি বলে যে পরীক্ষা" বলে আপনি কী বোঝাতে চেয়েছিলেন তা থেকে আমি সামান্যই ভুল বুঝেছি।
লিভারপুলস

2

স্পষ্টতই কিছু নিয়ামক এর চেয়ে জটিল তবে খালি আপনার উদাহরণের ভিত্তিতে:

মাই সার্ভিস যদি ব্যতিক্রম ছুঁড়ে ফেলে তবে কি হবে?

পার্শ্ব নোট হিসাবে।

এছাড়াও, আমি রেফারেন্স দ্বারা একটি তালিকা পাস করার বুদ্ধি নিয়ে প্রশ্ন করব (এটি অহেতুক যেহেতু রেফারেন্সের মাধ্যমে সি # পাস করে তবে তা না হলেও) - ত্রুটিযুক্ত ক্রিয়া (ক্রিয়া) যা পরিষেবাটি ত্রুটি বার্তাগুলি পাম্প করতে ব্যবহার করতে পারে যা আপনি চাইলেও পরিচালনা করতে পারেন (সম্ভবত আপনি এটি তালিকায় যুক্ত করতে চান, সম্ভবত আপনি একটি মডেল ত্রুটি যুক্ত করতে চান, সম্ভবত আপনি এটি লগ করতে চান)।

আপনার উদাহরণে:

রেফ ত্রুটির পরিবর্তে, (স্ট্রিং গুলি) => মডেলস্টেট করুন example উদাহরণস্বরূপ মডেলএরার ("" গুলি) করুন।


উল্লেখযোগ্য, এটি আপনার পরিষেবা একই অ্যাপ্লিকেশনটিতে বাস করছে ধরে নিয়েছে অন্যথায় সিরিয়ালাইজেশন সমস্যাগুলি কার্যকর হবে।
মাইকেল

পরিষেবাটি একটি আলাদা dll এ হবে। তবে যাইহোক, আপনি সম্ভবত "রেফ" ঠিকই আছেন। আপনার অন্য বিষয়টিতে, মাই সার্ভিস একটি ব্যতিক্রম ছুঁড়েছে কিনা তা বিবেচ্য নয়। আমি মাই সার্ভিসটি পরীক্ষা করছি না - আমি এতে পৃথকভাবে পদ্ধতিগুলি পরীক্ষা করব। আমি একটি বিদ্রূপযুক্ত মাই সার্ভিসারের সাথে (সম্ভবত) অ্যাকশনারসাল্ট "ইউনিট" খাঁটিভাবে পরীক্ষা করার কথা বলছি।
লিভারপুলস

আপনার পরিষেবা এবং আপনার নিয়ামকের মধ্যে আপনার কী 1: 1 ম্যাপিং রয়েছে? যদি তা না হয় তবে কিছু নিয়ামকরা কি একাধিক পরিষেবা কল ব্যবহার করেন? যদি তাই হয়, আপনি এই ইন্টারঅ্যাকশন পরীক্ষা করতে পারে?
মাইকেল

না। দিনের শেষে, পরিষেবার পদ্ধতিগুলি ইনপুট নেয় (সাধারণত একটি ভিউ মডেল বা এমনকি কেবল স্ট্রিং / ইনস), তারা "স্টাফ করে", তারপরে মিথ্যা / ভুল থাকলে ভুল প্রদান করে। কন্ট্রোলার এবং পরিষেবা স্তরের মধ্যে কোনও "সরাসরি" লিঙ্ক নেই। সম্পূর্ণরূপে পৃথক করা হয়।
লিভারপুলস

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