XUnit- এ সংগ্রহের আকার যাচাই করার মূর্তিযুক্ত উপায় কী?


111

আমার টেস্ট স্যুটে একটি পরীক্ষা রয়েছে যা এরকম কিছু হয়:

[Fact]
public void VerifySomeStuff()
{
    var stuffCollection = GetSomeStuff();

    Assert.Equal(1, stuffCollection.Count());
}

এই পরীক্ষাটি আমার প্রত্যাশার মতোই কাজ করে, তবে আমি যখন এটি চালাচ্ছি তখন xUnit একটি সতর্কতা প্রিন্ট করে:

সতর্কতা xUnit2013: সংগ্রহ আকারের জন্য চেক করতে Assert.Equal () ব্যবহার করবেন না।

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

যদি Assert.Equal()কোনও সংগ্রহের দৈর্ঘ্য যাচাই করার সঠিক উপায় না হয় তবে কী?


স্পষ্ট করার জন্য: আমি বুঝতে পেরেছি যে আমি উদাহরণস্বরূপ একটি ভেরিয়েবল বের করে বা এর Assert.True(stuff.Count() == 1)পরিবর্তে ব্যবহার করে এই সতর্কতাটি নির্গমন না করার জন্য "কৌশল" করতে পারি । পূর্ববর্তীটি কেবল হ্যাকি, এবং পূর্ববর্তীটির মনে হয় যে যদি xUnit উদাহরণস্বরূপ কোনওটির একাধিক পুনরাবৃত্তি এড়াতে চেষ্টা করা হয় IEnumerable<T>, তবে এটি যাওয়ার ভুল উপায় (কারণ আমি কোনও সমস্যা হলে আলাদাভাবে এটি সম্পর্কে সংকলক ইঙ্গিতগুলি পেয়ে যাব), এবং xUnit নিজেই কখনই ইনপুট একাধিকবার মূল্যায়ন করতে হবে না (বাস্তবে এটি ভেরিয়েবল এক্সট্রাকশন নির্বিশেষে একই ইনপুটটি পাবেন, কারণ সি # ফাংশন কলিং কীভাবে কাজ করে)।

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


যদি আপনি stuffCollection.Count()একটি পৃথক ভেরিয়েবল সঞ্চয় করে থাকেন এবং তা দৃ to়তার সাথে পাস করেন এটি কি আপনাকে একই ত্রুটি দেয়?
হেলিলে

উত্তর:


112

Xunit তার বেশিরভাগ সতর্কতার জন্য দ্রুত সমাধানের প্রস্তাব দেয়, তাই আপনার এটি "সঠিক" কী মনে করে তা দেখতে সক্ষম হওয়া উচিত।

xunit

আপনার ক্ষেত্রে, এটি আপনাকে ব্যবহার করতে চায় Assert.Singleযেহেতু আপনি ঠিক একটি আইটেমের প্রত্যাশা করছেন। যদি আপনি 412 এর মতো একটি স্বেচ্ছাসেবী সংখ্যা জোর দিয়ে থাকেন তবে এটি আপনাকে ব্যবহার সম্পর্কে কোনও সতর্কতা দেয় না Count। এটি কেবলমাত্র Singleযদি আপনি কোনও আইটেমের প্রত্যাশা করছেন বা Emptyআপনি কোনও আইটেম প্রত্যাশা না করেন তবে ব্যবহার করার পরামর্শ দিবে ।


6
ধন্যবাদ, এটি উপলব্ধি করে। এফডাব্লুআইডাব্লু, ভিএস কোড তৈরি করার সময় আমি এটি দেখছিলাম, যেখানে দ্রুত পদক্ষেপটি প্রদর্শিত হয়নি, সুতরাং সতর্কতার বার্তায় ফিক্স পরামর্শ সহ আসলে আরও বেশি সহায়ক হত।
টমাস আসচান

2
@ টমাসলাইকেন - আহ। হ্যাঁ এখানে এর জন্য একটি সমস্যা আছে: github.com/xunit/xunit/issues/1423
vcsjones

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

2
একক আইটেমের জন্য দুর্দান্ত, আমার কাছে 3 টি আইটেম রয়েছে এবং আমি সম্পূর্ণ Assert লিখতে চাই না Col সংগ্রহ, xUnit এ Assert.Triple আছে? হা হা
পাভেল সিওচ

1
@PawelCioch অনুযায়ী xunit.net/xunit.analyzers/rules/xUnit2013.html তারা আছে Empty, Singleএবং NotEmpty- আপনি একটি গতিশীল মান xUnit2013 ট্রিগার উচিত না আশা।
এমবিএক্স

2

আমি এটি আমাকে একই ত্রুটি দিতে দেখেছি:

Assert.Equal(2, vm.Errors.Count());

এবং এটি ingালাই ত্রুটিটি উপস্থিত হতে থামিয়েছে।

Assert.Equal(2, (int)vm.Errors.Count());

2
আমি পুরোপুরি নিশ্চিত, এই না ideomatic উপায়।
এমবিএক্স

1

একটি তালিকার একক উপাদানের জন্য, পরিবর্তে এটি ব্যবহার করা ভাল: Assert.Single(resultList);


-1

আমি xUnit হিসাবে নীচের হিসাবে গণনা সম্পত্তি ব্যবহার করার সময় আমার একই সমস্যা ছিল।

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

পরে, আমি সংগ্রহের ক্ষেত্রে গণনা () ফাংশনটি ব্যবহার করি, এটি আমার সমস্যাটি স্থির করে।


সমস্যাটি স্থির করা হয়েছে তবে আপনি এখনও আপনার যেমনটি XUnit ব্যবহার করেন না!
ড্যানিয়েল আইজেনেরিচ

8
@ ড্যানিয়েলইজনরিচ 1 এর চেয়ে বেশি হলে নির্দিষ্ট নম্বর গণনা করার সঠিক উপায় কী?
সোমগুইঅনাকম্পিউটার

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