2012-07-21 13 views
5

मान लीजिए मैं निम्नलिखित इकाई है:मजाक Guid.NewGuid()

public class User 
{ 
    public int Id { get; set; } 
    public string Username { get; set; } 
    public Guid UserGuid { get; set; } 
    public Guid ConfirmationGuid { get; set; } 
} 

और निम्नलिखित इंटरफ़ेस विधि:

void CreateUser(string username); 

कार्यान्वयन दो नए GUIDs बनाना चाहिए का एक हिस्सा: UserGuid के लिए एक, और ConfirmationGuid के लिए दूसरा। उन्हें मूल्यों को Guid.NewGuid() पर सेट करके ऐसा करना चाहिए।

मैं पहले से ही Guid.NewGuid निकाला है() ऐसे इंटरफेस का इस्तेमाल:

public interface IGuidService 
{ 
    Guid NewGuid(); 
} 

तो मैं आसानी से इस नकली कर सकते हैं जब केवल एक नया GUID की जरूरत है। लेकिन मुझे यकीन नहीं है कि एक ही विधि में, एक ही विधि में दो अलग-अलग कॉलों का नकल कैसे करें, जैसे कि वे अलग-अलग मान वापस कर दें।

उत्तर

9

आप Moq का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं:

mockGuidService.SetupSequence(gs => gs.NewGuid()) 
    .Returns(...some value here...) 
    .Returns(...another value here...); 

मैं आप निम्न कार्य कर सकता है लगता है: जब तक आप बस वापसी के भीतर एक यादृच्छिक मूल्य की आपूर्ति कर रहे, फिर भी

mockGuidService.Setup(gs => gs.NewGuid()) 
    .Returns(() => ...compute a value here...); 

कार्य, आदेश का ज्ञान अभी भी महत्वपूर्ण लगता है।

+0

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

+0

अच्छा ... आप राज्य बनाम व्यवहार परीक्षण में थोड़ा सा हो रहे हैं। मुझे यकीन नहीं है कि कॉल ऑर्डर के बारे में ज्ञान धारण किए बिना प्रश्न का उत्तर कैसे दिया जाए। –

+3

यदि मैं सही ढंग से समझता हूं, तो आप 'Assert.AreEqual (guid1, user.UserGuid) नहीं चाहते हैं; Assert.AreEqual (guid2, user.ConfirmationGuid); यदि आप असाइनमेंट का ऑर्डर बदलते हैं तो असफल हो जाते हैं। इसके बजाए आपको कुछ प्रकार के संग्रह आवेषण का उपयोग करना चाहिए जो ऑर्डर से स्वतंत्र है (नूनिट और एमस्टेस्ट दोनों में उपलब्ध है): 'CollectionAssert.AreEquivalent (नया [] {guid1, guid2}, नया [] {user.UserGuid, user.ConfirmationGuid}) ; –

4

यदि आप @ मैट के उदाहरण में मोक का उपयोग नहीं कर सकते हैं तो आप अपनी खुद की कक्षा बना सकते हैं जो अनिवार्य रूप से वही काम करेगा।

public class GuidSequenceMocker 
{ 
    private readonly IList<Guid> _guidSequence = new[] 
                { 
                 new Guid("{CF0A8C1C-F2D0-41A1-A12C-53D9BE513A1C}"), 
                 new Guid("{75CC87A6-EF71-491C-BECE-CA3C5FE1DB94}"), 
                 new Guid("{E471131F-60C0-46F6-A980-11A37BE97473}"), 
                 new Guid("{48D9AEA3-FDF6-46EE-A0D7-DFCC64D7FCEC}"), 
                 new Guid("{219BEE77-DD22-4116-B862-9A905C400FEB}") 
                }; 
    private int _counter = -1; 

    public Guid Next() 
    { 
     _counter++; 

     // add in logic here to avoid IndexOutOfRangeException 
     return _guidSequence[_counter]; 
    } 
} 
संबंधित मुद्दे