2011-05-23 14 views
18

लौट रहा है It.IsAny<string>() प्रत्येक कॉल पर शून्य वापस करने के कारण क्या हो सकता है? क्या मैं यह मानने में गलत हूं कि इसे एक गैर-शून्य स्ट्रिंग को वापस करने के लिए डिज़ाइन किया गया है?Moq - It.IsAny <string>() हमेशा शून्य

यहां उपयोग है - जहां लॉग इन विधि एक नल 2 तर्क (कनेक्शन स्ट्रिंग) के लिए ArgumentNullException फेंकता है। मैं मान रहा था कि It.IsAny<string>() एक गैर-शून्य स्ट्रिंग प्रदान करेगा, जो ArgumentNullException को बाईपास करेगा। जो बारी में रिटर्न default(TValue) -

var mockApiHelper = new Mock<ApiHelper>(); 
mockApiHelper.Setup(m => m.Connect(It.IsAny<string>(), 
            It.IsAny<string>(), 
            It.IsAny<string>())); 

var repositoryPlugin = new RepositoryPlugin(mockApiHelper.Object); 
repositoryPlugin.Login(new CredentialsInfo(), It.IsAny<string>()); 

Assert.IsTrue(repositoryPlugin.LoggedIn, 
    "LoggedIn property should be true after the user logs in."); 

उत्तर

24

खैर, It.IsAny<TValue> सिर्फ Match<TValue>.Create बुलाने की परिणाम देता है। यह किसी भी संदर्भ प्रकार के लिए शून्य होगा।

यह स्पष्ट नहीं है कि आप वास्तव में सही वस्तु पर कॉल कर रहे हैं या नहीं - क्या आपको इसे वास्तविक कोड के बजाय नकली पर कॉल नहीं करना चाहिए?

mock.Setup कॉल के संदर्भ में मैंने देखा है कि सभी नमूने It.IsAny का उपयोग करते हैं। क्या आप इसका उपयोग करने की कोशिश कर रहे हैं के बारे में अधिक जानकारी दे सकते हैं?

+0

आह, मैं देख रहा हूँ। मैंने प्रश्न के लिए पूर्ण परीक्षण जोड़ा है। मैं इसे अपने मॉक के साथ-साथ एक वास्तविक वस्तु के लिए भी उपयोग कर रहा हूं। लेकिन ऐसा लगता है कि यह वास्तविक वस्तुओं के उपयोग के लिए नहीं है? – Jeremy

+1

@ जेरेमी: नहीं, विचार यह है कि आप वास्तविक मूल्यों (अच्छी तरह से, नमूना मूल्य) में अपने वास्तविक कोड में गुजरते हैं। 'It.IsAny' का अर्थ है * आपके वास्तविक कोड से * आपके मैक्स में दिए गए मानों को सत्यापित करना। –

+0

समझ गया - इसलिए मैं इसे डेटा जनरेशन तकनीक के रूप में सोच रहा था ... लेकिन इसका इरादा नहीं है। धन्यवाद! – Jeremy

2

It.IsAny का उपयोग आपके Returns() और Callback() में कोड को मेल करने के लिए किया जाता है जो आपके परीक्षणों में जो धक्का देता है उसे नियंत्रित करता है।

10

नहीं, It.IsAny का उपयोग आपके सेटअप में निर्दिष्ट करने के लिए किया जाता है कि कोई भी स्ट्रिंग पास हो जाएगी। आप अपना सेटअप कर सकते हैं ताकि यदि आपकी विधि केवल एक विशेष स्ट्रिंग के साथ बुलाया जाता है तो यह वापस आ जाएगा। इस पर विचार करें:

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123); 
myMock.Setup(x => x.DoSomething("SpecialString").Return(456); 

जो कुछ भी नकली उपयोग कर रहा है तो पैरामीटर जब DoSomething शुरू हो जाती है नकली पारित हो जाता है के आधार पर अलग मूल्य मिलेगा। विधि कॉल सत्यापित करते समय आप वही काम कर सकते हैं:

myMock.Verify(x => x.DoSomething(It.IsAny<string>())); // As long as DoSomething was called, this will be fine. 
myMock.Verify(x => x.DoSomething("SpecialString")); // DoSomething MUST have been called with "SpecialString" 

इसके अलावा, मुझे लगता है कि आपने अपना प्रश्न संपादित किया है। बजाय:

Assert.IsTrue(repositoryPlugin.LoggedIn, "LoggedIn property should be true after the user logs in."); 

ऐसा करते हैं:

mockApiHelper.Verify(x => x.Connect(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once()); // Change times to whatever you expect. If you expect particular values, replace the relevent It.IsAny<string() calls with those actual vaules. 
संबंधित मुद्दे