Moq

2012-07-03 14 views
27

में सेटअप अपक्वेंस मैं चाहता हूं कि एक नकली पहली बार 0 लौटाए, फिर विधि को कभी भी 1 बार वापस कर दिया जाए। समस्या यह है कि यदि विधि को 4 बार कहा जाता है, तो मुझे यह लिखना चाहिए:Moq

mock.SetupSequence(x => x.GetNumber()) 
    .Returns(0) 
    .Returns(1) 
    .Returns(1) 
    .Returns(1); 

अन्यथा विधि शून्य हो जाती है।

क्या लिखने का कोई तरीका है कि अगली बार विधि को पहली बार बुलाया गया था, विधि 1 लौटाती है? धन्यवाद

क्या सेटअपअप के लिए अधिक "ऑपरेटर" होना अच्छा है? आपको लगता है हाँ अगर आप वोट कर सकते हैं: http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

उत्तर

32

खासकर कल्पना नहीं है यही कारण है, लेकिन मुझे लगता है कि यह काम करेगा:

var firstTime = true; 

    mock.Setup(x => x.GetNumber()) 
     .Returns(()=> 
         { 
          if(!firstTime) 
           return 1; 

          firstTime = false; 
          return 0; 
         }); 
+0

ठीक है, मैं आपको धन्यवाद दे रहा हूं – Florian

+0

ठीक काम करता है! धन्यवाद ! – Florian

3

कि आपको अस्थायी चर का उपयोग कर सकते हैं कि कितनी बार विधि बुलाया गया था का ट्रैक रखने के ।

उदाहरण:

public interface ITest 
{ Int32 GetNumber(); } 

static class Program 
{ 
    static void Main() 
    { 
     var a = new Mock<ITest>(); 

     var f = 0; 
     a.Setup(x => x.GetNumber()).Returns(() => f++ == 0 ? 0 : 1); 

     Debug.Assert(a.Object.GetNumber() == 0); 
     for (var i = 0; i<100; i++) 
      Debug.Assert(a.Object.GetNumber() == 1); 
    } 
} 
26

स्पष्ट तरीका एक Queue बना सकते हैं और पारित करने के लिए है .Dequeue विधि के लिए Returns

.Returns(new Queue<int>(new[] { 0, 1, 1, 1 }).Dequeue);

+4

यह "अनंत" बाद के कॉल का समर्थन नहीं करता है ... –

+0

@RomainVerdier - नहीं, ऐसा नहीं है। मुझे लगता है कि ओपी 4 आविष्कारों के साथ समाधान मांगता है। –

+3

सब - मेरी प्रारंभिक गलती से बचें। यदि आप इसे परिभाषित करते हैं कि आपके पास रिटर्न (myQueue.Dequeue()) है तो आपको केवल पहला परिणाम मिलेगा - क्योंकि आपने वास्तव में लैम्ब्डा अभिव्यक्ति की आपूर्ति करने के बजाय परिणाम को अस्वीकार कर दिया है। – sfuqua

1

बस सेटअप की तरह एक विस्तार विधि:

public static T Denqueue<T>(this Queue<T> queue) 
{ 
    var item = queue.Dequeue(); 
    queue.Enqueue(item); 
    return item; 
} 

ए nd फिर वापसी की तरह:

var queue = new Queue<int>(new []{0, 1, 1, 1}); 
mock.Setup(m => m.GetNumber).Returns(queue.Denqueue);