XUnit में संग्रह आकार को सत्यापित करने के लिए मुहावरेदार तरीका क्या है?


112

मेरे पास मेरे परीक्षण सूट में एक परीक्षण है जो कुछ इस तरह से जाता है:

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

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

यह परीक्षण मेरी अपेक्षा के अनुसार काम करता है, लेकिन जब मैं इसे चलाता हूं तो xUnit चेतावनी देता है:

चेतावनी xUnit2013: संग्रह आकार की जांच करने के लिए Assert.Equal () का उपयोग न करें।

हालाँकि, चेतावनी में कोई विकल्प नहीं सुझाया गया है, और एक Google खोज मुझे इस परीक्षण के स्रोत xUnit में स्रोत कोड पर ले जाती है जो इस चेतावनी को सत्यापित करता है, मुद्रित होता है।

यदि Assert.Equal()संग्रह की लंबाई को सत्यापित करने का सही तरीका नहीं है, तो क्या है?


स्पष्ट करने के लिए: मुझे एहसास हुआ कि मैं इस चेतावनी को "छल" नहीं कर सकता, जैसे कि एक चर निकालने या Assert.True(stuff.Count() == 1)इसके बजाय उपयोग करके इस चेतावनी को नहीं छोड़ना । उत्तरार्द्ध सिर्फ हैक है, और पूर्व की तरह लगता है कि अगर xUnit एक के कई पुनरावृत्तियों से बचने की कोशिश कर रहा है जैसे IEnumerable<T>, तो यह जाने का गलत तरीका है (क्योंकि मुझे इसके बारे में अलग से संकलक संकेत मिलेंगे यदि यह एक मुद्दा है), और xnnit स्वयं को कभी भी एक से अधिक बार इनपुट का मूल्यांकन नहीं करना चाहिए (वास्तव में यह शायद वैसा ही इनपुट प्राप्त करेगा, क्योंकि C # फ़ंक्शन कॉलिंग कार्य कैसे होता है)।

इसलिए, मुझे अपने आउटपुट से उस चेतावनी को हटाने में कोई दिलचस्पी नहीं है। मेरे प्रश्न का उत्तर यह भी बताता है कि क्यों उस चेतावनी को पहली बार पुस्तकालय में शामिल किया गया है और इसके बजाय मुझे जो भी दृष्टिकोण का उपयोग करना चाहिए वह बेहतर क्यों है।


यदि आप stuffCollection.Count()एक अलग चर में संग्रहित करते हैं और इसे पास करते हैं तो क्या यह आपको वही त्रुटि देता है?
हेलिले

जवाबों:


112

Xunit अपनी अधिकांश चेतावनियों के लिए त्वरित सुधार प्रदान करता है, इसलिए आपको यह देखने में सक्षम होना चाहिए कि यह "सही" क्या है।

XUnit

आपके मामले में, यह आप का उपयोग करना चाहता है Assert.Singleक्योंकि आप बिल्कुल एक आइटम की उम्मीद कर रहे हैं। यदि आप 412 की तरह एक मनमानी संख्या का अनुमान लगा रहे हैं, तो यह आपको उपयोग करने के बारे में चेतावनी नहीं देगा Count। यह केवल तभी उपयोग करने का सुझाव देगा Singleजब आप किसी एक आइटम की अपेक्षा कर रहे हों, या Emptyयदि आप किसी आइटम की अपेक्षा कर रहे हों।


6
धन्यवाद, यह समझ में आता है। एफडब्ल्यूआईडब्ल्यू, मैं वीएस कोड में निर्माण करते समय यह देख रहा था, जहां त्वरित कार्रवाई दिखाई नहीं देती थी, इसलिए वास्तव में चेतावनी संदेश में फिक्स सुझाव सहित बहुत अधिक सहायक होता।
टॉमस एशचन

2
@TomasLycken - आह। हाँ यहाँ इसके लिए एक मुद्दा है: github.com/xunit/xunit/issues/1423
vcsjones

5
मैं उस व्यवहार का प्रशंसक नहीं हूं; कभी-कभी 1 गणना सिर्फ आकस्मिक होती है, और यह कॉलिंग को लागू करने के लिए कम अभिव्यंजक लगता है। सिंगल ()। परीक्षण एक अलग गिनती की उम्मीद में बदल सकता है, और यह केवल एक नंबर बदलने के बजाय एक पूरी तरह से अलग विधि को कॉल करने के लिए परिवर्तन करने के लिए कष्टप्रद लगता है।
वार्गोनियन

2
सिंगल आइटम के लिए सिंगल कूल है, मेरे पास 3 आइटम हैं, और मैं पूर्ण Assert.Collection लिखना नहीं चाहता, क्या xUnit में Assert.Triple है? हाहा
पावेल कियोच

1
@PawelCioch के अनुसार xunit.net/xunit.analyzers/rules/xUnit2013.html उनके पास है Empty, Singleऔर NotEmpty- यदि आप उम्मीद करते हैं कि एक गतिशील मूल्य xUnit2013 ट्रिगर नहीं होना चाहिए।
mbx

2

मैंने पाया कि यह मुझे वही त्रुटि देता है:

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

और इसे कास्टिंग ने त्रुटि को प्रदर्शित होने से रोक दिया।

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

2
मैं काफी यकीन है, यह है नहीं ideomatic रास्ता।
mbx

1

किसी सूची में एकल तत्व के लिए, इसके बजाय इसका उपयोग करना सबसे अच्छा है: Assert.Single(resultList);


-1

मेरे पास एक ही मुद्दा था जब मैंने xUnit में नीचे दी गई गणना की संपत्ति का उपयोग किया था।

यहां छवि विवरण दर्ज करें

बाद में, मैं संग्रह पर गणना () फ़ंक्शन का उपयोग करता हूं, इसने मेरे मुद्दे को ठीक किया।


समस्या को ठीक कर दिया, लेकिन आप अभी भी XUnit का उपयोग नहीं करना चाहिए जैसे आपको करना चाहिए!
डेनियल आइसेनरिच

8
@DanielEisenreich 1 से अधिक होने पर किसी विशिष्ट संख्या के लिए गणना करने का सही तरीका क्या है?
SomeGuyOnAComputer

@SomeGuyOnAComputer और अन्य 4 upvotes। जो मैंने कहा, उसे भूल जाओ, मैं भी बहुत चूजी था। यदि यह अधिक है तो आपके पास कोई अन्य विकल्प नहीं है।
डैनियल ईसेनरिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.