2009-04-19 11 views
22

विजुअल स्टूडियो प्रोफेसरोन 2008 की टेस्ट क्षमताओं में प्रारंभिक, असफल इकाई परीक्षण बनाने के प्रयास में ऑब्जेक्ट। रेफरेंस एक्वाल्स() पास करता है जहां मुझे 'झूठा' देता है, मुझे Assert.ReferenceEquals() प्राप्त नहीं हो रहा है जब कोई ऑब्जेक्ट उदाहरण शून्य संदर्भ के बराबर होता है तो सही ढंग से विफल हो जाता है। ध्यान दें कि object.ReferenceEquals() इसी तुलना के लिए false सही ढंग से लौट रहा है। ,Assert.ReferenceEquals() विजुअल स्टूडियो टेस्ट

[TestClass()] 
public class ProjectTest 
{ 
    [TestMethod()] 
    public void StartupTest() 
    { 
     object obj = "hello"; 
     Project.Startup(obj);  
     Assert.ReferenceEquals(obj, Project.TheObject); // Test Passes!?! 
    } 
} 

ध्यान दें कि static void Startup(object) विधि रिक्त है तो static object TheObject संपत्ति नहीं है:

public static class Project 
{ 
    public static object TheObject { get; set; } 

    public static void Startup(object theObject) 
    { 
     // ToDo: Project.Startup(): Test. 
     // ToDo: Project.Startup(): Implement. 
    } 
} 

और फिर यहाँ अपने परीक्षण वर्ग के महत्वपूर्ण पहलुओं हैं:

यहाँ मेरी कक्षा कोड है सेट करें और null बनी हुई है। तो, स्पष्ट रूप से, Assert.ReferenceEquals(obj, Project.TheObject) विफल होना चाहिए, लेकिन किसी भी तरह से यह परीक्षण गुजरता है।

ध्यान दें कि

Assert.ReferenceEquals(obj, Project.TheObject)

बदलते सही ढंग से को

Assert.IsTrue(object.ReferenceEquals(obj, Project.TheObject))

इस परीक्षण का कारण बनता है असफल।

यह बहुत आसान लगता है, और फिर भी मैं नहीं देख सकता कि यहां क्या गलत हो रहा है। अगर कोई मेरे तरीके से त्रुटि को इंगित कर सकता है, तो मैं बहुत बाध्य होगा।

अग्रिम धन्यवाद,

माइक

अद्यतन जेम्स एवरी से उत्तर दिया:

आह, एक कैसे मूर्ख मैं अब लग रहा है। मैं जानता था इसे ऐसा कुछ होना था। वाह।

निश्चित रूप से, 'GoToDefinition' मुझे 'ऑब्जेक्ट। ReferenceEquals()' पर ले जाता है। तो टाइपिंग "Assert.ReferenceEquals()" वास्तव में System.Object.ReferenceEquals() है, जो मेरे मामले में चुपचाप 'झूठी' लौट रहा था। यह, ज़ाहिर है, वास्तव में किसी दावे में असफल होने के साथ कुछ लेना देना नहीं है, इसलिए परीक्षण पास करता है। गजब का।

धन्यवाद जेम्स।

+0

मुझे अभी भी इसी मूर्खतापूर्ण गलती से मारा गया है। यह गिरने के लिए इतना आसान जाल है। ऐसा लगता है कि यूनिट टेस्ट क्लासेस कम से कम चेतावनी फेंक सकते हैं यदि कोई वास्तविक दावा नहीं कहा जाता है। इससे कम से कम आपके नमूना कोड जैसे नमूने कोड और विशेष संपत्ति जांच को पूरा करने का प्रयास करने वाले बहुत ही सरल मामलों को पकड़ लिया जाएगा। –

+0

"ऐसा लगता है कि यूनिट टेस्ट क्लासेस कम से कम चेतावनी फेंक सकते हैं यदि कोई वास्तविक दावा नहीं कहा जाता है।" <- यह एक मूर्खतापूर्ण विचार है और न केवल इस मूर्खतापूर्ण जाल के खिलाफ सुरक्षा के लिए। मुझें यह पसंद है। –

+2

एक बेहतर विचार, हालांकि, 'रेफरेंस एक्वाल्स' नामक एक नई स्थैतिक विधि बनाने के लिए आर्टर्ट क्लास के लिए होगा जो 'ऑब्जेक्ट। रेफरेंस एक्वाल्स' विधि को छाया देगा और उसके बाद उस विधि को अप्रचलित त्रुटि संदेश के साथ ObsoleteAttribute के साथ चिह्नित करेगा। इस तरह उपयोगकर्ता को चेतावनी दी जाएगी कि क्या उन्होंने यह गलती की है। –

उत्तर

30

संदर्भ संदर्भ विधि जो आप कॉल कर रहे हैं वह सभी संदर्भ वस्तुओं पर उपलब्ध स्थिर विधि है, यह परीक्षण ढांचे का हिस्सा नहीं है। यदि आप देखते हैं कि यह एक बूलियन वैल्यू लौटा रहा है जबकि एक सामान्य दावा शून्य हो जाएगा। यह निश्चित रूप से भ्रमित है, .अरेसम() वह दावा है जिसे आप ढूंढ रहे हैं।

+1

आह, अब मुझे कितना मूर्ख लगता है। मुझे पता था * यह ऐसा कुछ होना था। वाह। निश्चित रूप से, 'GoToDefinition' मुझे 'ऑब्जेक्ट। ReferenceEquals()' पर ले जाता है। तो टाइपिंग "Assert.ReferenceEquals()" वास्तव में ऑब्जेक्ट है। ReferenceEquals(), जो मेरे मामले में चुपचाप 'झूठी' लौट रहा था - जो, वास्तव में, वास्तव में किसी दावे को विफल करने में कुछ भी नहीं है। तो परीक्षण ** पास **। गजब का। धन्यवाद जेम्स। –

+1

मैं इसी तरह की समस्या में भाग गया और NUnit एक अपवाद फेंकता है जो दर्शाता है कि संदर्भ के लिए संदर्भ Equations का उपयोग न करें। जैसा कि आपने सुझाव दिया है, मैंने इसे Assert.AreSame() में बदल दिया है। वे स्पष्ट रूप से एक अपवाद फेंकने के लिए Assert.ReferenceEquals() को ओवरराइड करते हैं, लेकिन फ़ंक्शन को ओवरराइड क्यों नहीं करते हैं जो हम उम्मीद करते हैं? –

संबंधित मुद्दे