নুনিট অ্যাসেটটি ব্যবহার করুন hআলাজ পদ্ধতি বা প্রত্যাশিত এক্সপশন বৈশিষ্ট্য?


146

আমি আবিষ্কার করেছি যে এগুলি ব্যতিক্রমগুলির জন্য পরীক্ষার দুটি প্রধান উপায় বলে মনে হচ্ছে:

Assert.Throws<Exception>(()=>MethodThatThrows());

[ExpectedException(typeof(Exception))]

এর মধ্যে কোনটি সবচেয়ে ভাল হবে? এক অন্যের চেয়ে সুবিধা দেয়? অথবা এটি কি কেবল ব্যক্তিগত পছন্দের বিষয়?


3
তৃতীয় বিকল্পটি সাবলীল শৈলী:Assert.That(() => MethodThatThrows(), Throws.Exception)
জ্যাক উকলেজা

1
NUnit সংস্করণ 3 এবং পরবর্তীকালে এই ExpectedExceptionগুনটি আর সমর্থন করে না , সুতরাং সংস্করণ 3+ এর জন্য কেবল Assert.Throwsবৈকল্পিক প্রাসঙ্গিক।
joanlofe

এটা এমন কেন? সেই নুনিট 3 সেই সমর্থন বাদ দেওয়ার সিদ্ধান্ত নিয়েছে? চারপাশে গুগল ছিল এবং এর ব্যাখ্যা খুঁজে পেল না ... ইউনিত এখনও এইভাবে সমর্থন করে, তাই না?
আহমান

উত্তর:


92

প্রথমটি আপনাকে একাধিক কল সহ একাধিক ব্যতিক্রমের জন্য পরীক্ষা করতে দেয়:

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());

দ্বিতীয়টি আপনাকে কেবল পরীক্ষার জন্য প্রতি ব্যতিক্রমের জন্য পরীক্ষা করতে দেয় allows


25
একটি পরীক্ষা শুধুমাত্র একটি স্বতন্ত্র বিট যুক্তি পরীক্ষা করা উচিত, সুতরাং একই ইউনিট পরীক্ষায় দুটি ত্রুটি পরীক্ষা করা খারাপ অভ্যাস হিসাবে বিবেচিত হবে না?
স্যামুয়েলডাভিস

5
@ সামুয়েলড্যাভিস - সাধারণভাবে আপনি একই পরীক্ষায় বিভিন্ন কেস পরীক্ষা করতে চান না। তবে একাধিক জন্য কিছু ব্যবহারের কেস থাকতে পারে Assert.Throws
chue x

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

254

মূল পার্থক্যটি হ'ল:

ExpectedException()পরীক্ষা পদ্ধতিতে কোনও স্থানে ব্যতিক্রম ঘটলে অ্যাট্রিবিউট পরীক্ষায় উত্তীর্ণ হয় ।
এর ব্যবহারটি কোডের জায়গা Assert.Throws()নির্দিষ্ট করতে দেয় exactযেখানে ব্যতিক্রম প্রত্যাশিত।

NUnit 3.0 ExpectedExceptionসম্পূর্ণরূপে সরকারী সমর্থন ড্রপ করে।

সুতরাং, আমি স্পষ্টভাবে গুণাবলীর Assert.Throws()চেয়ে পদ্ধতিটি ব্যবহার করতে পছন্দ করি ExpectedException()


7
এটি এখন পর্যন্ত সঠিক উত্তর। ঘটনাচক্রে, Assert.Throws () এছাড়াও ব্যতিক্রম প্রত্যাবর্তন করে, যা ব্যতিক্রমগুলির বৈশিষ্ট্যগুলি যদি আপনার কাছে বিবেচিত হয় তবে এটি অতিরিক্ত তদন্তের অনুমতি দিতে পারে।
পারফেকশনিস্ট

1
পরিশেষে উত্তর দিন কেন আমি প্রত্যাশিত
ধারণাটি

2
এখানে github.com/nunit/docs/wiki/Breaking-Changes লিঙ্কটি রয়েছে - প্রত্যাশিত এক্সপ্লেশনঅ্যাট্রিবিউট আর সমর্থন করে না।
আন্তন লাহিন

এটিকে নুনিট ৩.০ এর অধীনে কাজ করতে
এইটিকে

38

আমি assert.throws পছন্দ করি যেহেতু এটি ব্যতিক্রম ছোঁড়ার পরে আমাকে অন্য শর্তগুলি যাচাই করতে এবং দৃsert়তার সাথে মঞ্জুরি দেয়।

    [Test]
    [Category("Slow")]
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
    {
        // the exception we expect thrown from the IsValidFileName method
        var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName(""));

        // now we can test the exception itself
        Assert.That(ex.Message == "Blah");

    }

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

11

আপনি যে ত্রুটিটি প্রত্যাশা করছেন তাও আপনি প্রকারের টাইপ করতে পারেন (পুরাতন বৈশিষ্ট্য সংস্করণটির মতো)।

Assert.Throws<System.InvalidOperationException>(() => breakingAction())

1

আপনি যদি এর থেকে পুরানো সংস্করণ ( <= 2.0 ) ব্যবহার করেন NUnitতবে আপনার ব্যবহার করা দরকার ExpectedException

আপনি যদি 2.5 বা পরবর্তী সংস্করণ ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেনAssert.Throw()

https://github.com/nunit/docs/wiki/Breaking-Changes

কীভাবে ব্যবহার করবেন: https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5

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