2011-08-12 10 views
27

पर सफल होने के लिए मोक का उपयोग करने के लिए सबसे महत्वपूर्ण तरीका क्या है जो पहली बार इसे अपवाद फेंक देगा, फिर दूसरी बार इसे सफल करेगा कहा जाता है?Moq: पहले कॉल पर असफल होने के लिए एक मॉक विधि सेट करें, दूसरे

+4

Moq 4.2 और उच्च अब 'SetupSequence के माध्यम से इस का समर्थन करता है()'। –

उत्तर

39

मैं Callback का इस्तेमाल करते हैं और एक काउंटर बढ़ाने के निर्धारित करने के लिए किया जाए या नहीं Callback से एक अपवाद फेंकने के लिए होगा।

[Test] 
public void TestMe() 
{ 
    var count = 0; 
    var mock = new Mock<IMyClass>(); 
    mock.Setup(a => a.MyMethod()).Callback(() => 
     { 
      count++; 
      if(count == 1) 
       throw new ApplicationException(); 
     }); 
    Assert.Throws(typeof(ApplicationException),() => mock.Object.MyMethod()); 
    Assert.DoesNotThrow(() => mock.Object.MyMethod()); 
} 

public interface IMyClass 
{ 
    void MyMethod(); 
} 
+0

यह एक अच्छा जवाब है और 2 से अधिक चीजें होने के बाद यह दृष्टिकोण बेहतर हो जाता है। – anthony

+0

यह दृष्टिकोण सरल है जो अच्छा है, लेकिन उस पोस्ट को फिल हैक द्वारा @ माथीस के उत्तर से देखें। यह बहुत चिकना है। एक विस्तार विधि का उपयोग करके आप 'reader.Setup (r => r.Read()) जैसे कुछ कर सकते हैं। ReturnsInOrder (सत्य, सत्य, झूठा); ' – rsbarro

+3

रिटर्न्सइनऑर्डर() अच्छा है यदि आप मानों का अनुक्रम वापस करना चाहते हैं लेकिन यह स्पष्ट रूप से स्पष्ट नहीं था कि अनुक्रम के हिस्से के रूप में अपवाद फेंकने के लिए इसका उपयोग कैसे किया जाए। – anthony

16
सबसे अच्छा है कि मैं अब तक लेकर आए हैं

यह है:

interface IFoo 
{ 
    void Bar(); 
} 

[Test] 
public void TestBarExceptionThenSuccess() 
{ 
    var repository = new MockRepository(MockBehavior.Default); 
    var mock = repository.Create<IFoo>(); 

    mock.Setup(m => m.Bar()). 
     Callback(() => mock.Setup(m => m.Bar())). // Setup() replaces the initial one 
     Throws<Exception>();      // throw an exception the first time 

    ... 
} 
+1

+1 यह एक अच्छा तरीका है। कोड में जो कुछ भी हो रहा है उसमें ठोकरें किसी के लिए स्पष्ट नहीं हो सकता है। – rsbarro

+3

शानदार। यह मेरे लिए बहुत अच्छा काम किया। –

+0

अच्छा, मैंने इस बारे में सोचा नहीं! –

5

फिल Haack परिणाम के किसी खास अनुक्रम वापस जाने के लिए एक विधि की स्थापना पर एक दिलचस्प blog post है। ऐसा लगता है कि यह एक अच्छा प्रारंभिक बिंदु होगा, जिसमें कुछ काम शामिल हैं, क्योंकि किसी निश्चित प्रकार के मूल्यों के अनुक्रम के बजाय, आपको अब परिणामों का अनुक्रम होना चाहिए जो कि प्रकार टी या अपवाद हो सकता है।

+0

दिलचस्प पढ़ा, धन्यवाद। – anthony

3

Moq 4.2 से शुरू करना आप अंतर्निहित विधि SetupSequence() (जैसा कि @RichardBarnett टिप्पणी द्वारा बताया गया है) का उपयोग कर सकते हैं।

उदाहरण:

var mock = new Mock<IMyClass>(); 
mock.SetupSequence(x => x.MyMethod("param1")) 
    .Throws<MyException>() 
    .Returns("test return");