2010-06-22 9 views
14

मुझे एक विधि में लगातार कॉल पर विभिन्न मूल्यों को वापस करने के लिए एक Moq ऑब्जेक्ट मिलता है। यह इस विस्तार विधि द्वारा किया जाता है:विभिन्न परिणामों को लौटाना या लगातार कॉल से अपवाद फेंकना मोक मॉक

public static void ReturnsInOrder<T, TResult>(this ISetup<T, TResult> setup, params TResult[] results) where T : class 
{ 
    setup.Returns(new Queue<TResult>(results).Dequeue); 
} 

अब मैं एक अपवाद फेंकने के लिए कॉल में से एक चाहता हूं जबकि अन्य कुछ वापस कर दें। क्या किसी ने इसे पहले किया है?

तो मुझे क्या इस

mock.Setup(m => m.SomeMethod()) 
    .Throws(new Exception()); 
mock.Setup(m => m.SomeMethod()) 
    .Returns("ok"); 

तो पहले सेटअप ओवरराइट है और केवल दूसरे सेटअप बनी हुई है।

उत्तर

9

मैंने पुनः प्रयास प्रॉक्सी विकसित करते समय कॉलबैक चेनिंग का उपयोग किया।

var src = new Mock<ITest>(); 
src.Setup(s => s.RaiseError()).Callback(() => 
src.Setup(s => s.RaiseError())).Throws<Exception>(); 

const int retryCount = 1; 
var proxy = RetryProxy.MakeFor(src.Object, retryCount); 

proxy.RaiseError(); 
src.Verify(s => s.RaiseError(), Times.Exactly(retryCount+1)); 
+0

यह (बल्कि जटिल) समाधान के बाद से Moq SetupSequence विधि के लिए समर्थन हासिल है अब आवश्यक नहीं है। उदाहरण के लिए नीचे मेरा जवाब देखें। – nashwan

10

आजकल Moq (संस्करण 4) ने अपने SetupSequence विधि के माध्यम से इस का समर्थन करता है। एक परिचय के लिए this post देखें।

+1

लेकिन आधिकारिक रिलीज में यह अपवाद फेंकने के बाद मॉक विधि से मूल्य वापस करने की अनुमति नहीं देता है (फिर भी इसे विपरीत क्रम में करने के लिए संभव है) - https://code.google.com/p/moq/issues/detail? आईडी = 319 – Marek

0

नकली वस्तु पर SetupSequence(...) का उपयोग करें।

उदाहरण के लिए निम्नलिखित पहली कॉल पर अपवाद फेंक और दूसरी कॉल पर someResponse वापस आ जाएगी:

myService.SetupSequence(s => s.PlaceOrder()) 
    .Throws(new Exception()) 
    .Returns(someResponse); 
+0

रिटर्न शून्य देता है इसलिए इस आदेश की अनुमति नहीं है (Moq संस्करण 4.0 का उपयोग करके) –

+0

क्या आप वाकई हैं? क्योंकि मैं कोड की इस वास्तविक पंक्ति का उपयोग कर रहा हूं और यह मेरे लिए ठीक काम करता है। मैं Moq संस्करण 4.0.30319 का उपयोग कर रहा हूँ। क्या आप सुनिश्चित हैं कि आपका "प्लेस ऑर्डर()" (या समतुल्य विधि) वास्तव में कहा जा रहा है? – nashwan

+0

मैं Moq.SoutCastle -Version 4.0.10827.2 का उपयोग कर रहा हूं और कोड संकलित नहीं होगा। शायद यह Moq.SoutCastle की एक सीमा है। –

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