पर सफल होने के लिए मोक का उपयोग करने के लिए सबसे महत्वपूर्ण तरीका क्या है जो पहली बार इसे अपवाद फेंक देगा, फिर दूसरी बार इसे सफल करेगा कहा जाता है?Moq: पहले कॉल पर असफल होने के लिए एक मॉक विधि सेट करें, दूसरे
उत्तर
मैं 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();
}
यह एक अच्छा जवाब है और 2 से अधिक चीजें होने के बाद यह दृष्टिकोण बेहतर हो जाता है। – anthony
यह दृष्टिकोण सरल है जो अच्छा है, लेकिन उस पोस्ट को फिल हैक द्वारा @ माथीस के उत्तर से देखें। यह बहुत चिकना है। एक विस्तार विधि का उपयोग करके आप 'reader.Setup (r => r.Read()) जैसे कुछ कर सकते हैं। ReturnsInOrder (सत्य, सत्य, झूठा); ' – rsbarro
रिटर्न्सइनऑर्डर() अच्छा है यदि आप मानों का अनुक्रम वापस करना चाहते हैं लेकिन यह स्पष्ट रूप से स्पष्ट नहीं था कि अनुक्रम के हिस्से के रूप में अपवाद फेंकने के लिए इसका उपयोग कैसे किया जाए। – anthony
यह है:
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 यह एक अच्छा तरीका है। कोड में जो कुछ भी हो रहा है उसमें ठोकरें किसी के लिए स्पष्ट नहीं हो सकता है। – rsbarro
शानदार। यह मेरे लिए बहुत अच्छा काम किया। –
अच्छा, मैंने इस बारे में सोचा नहीं! –
फिल Haack परिणाम के किसी खास अनुक्रम वापस जाने के लिए एक विधि की स्थापना पर एक दिलचस्प blog post है। ऐसा लगता है कि यह एक अच्छा प्रारंभिक बिंदु होगा, जिसमें कुछ काम शामिल हैं, क्योंकि किसी निश्चित प्रकार के मूल्यों के अनुक्रम के बजाय, आपको अब परिणामों का अनुक्रम होना चाहिए जो कि प्रकार टी या अपवाद हो सकता है।
दिलचस्प पढ़ा, धन्यवाद। – anthony
Moq 4.2 से शुरू करना आप अंतर्निहित विधि SetupSequence()
(जैसा कि @RichardBarnett टिप्पणी द्वारा बताया गया है) का उपयोग कर सकते हैं।
उदाहरण:
var mock = new Mock<IMyClass>();
mock.SetupSequence(x => x.MyMethod("param1"))
.Throws<MyException>()
.Returns("test return");
Moq 4.2 और उच्च अब 'SetupSequence के माध्यम से इस का समर्थन करता है()'। –