Moq

2012-02-03 17 views
57

का उपयोग कर एक विधि कॉल सत्यापित करें मैं सी # में यूनिट परीक्षण के लिए बिल्कुल नया हूं और Moq का उपयोग करना सीख रहा हूं। नीचे वह वर्ग है जिसे मैं परीक्षण करने की कोशिश कर रहा हूं।Moq

class MyClassTest 
{ 
    [TestMethod()] 
    public void MyMethodTest() 
    { 
     string action="test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 
     mockSomeClass.SetUp(a => a.DoSomething(action)); 
     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 
     mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>())); 
    } 
} 

मैं निम्नलिखित अपवाद:

Expected invocation on the mock at least once, but was never performed 
No setups configured. 
No invocations performed.. 

मैं सिर्फ अगर विधि "MyMethod" कहा जाता है की जा रही है या नहीं सत्यापित करना चाहते

class MyClass 
{ 
    SomeClass someClass; 
    public MyClass(SomeClass someClass) 
    { 
     this.someClass = someClass;  
    } 

    public void MyMethod(string method) 
    { 
     method = "test" 
     someClass.DoSomething(method); 
    } 
} 

class Someclass 
{ 
    public DoSomething(string method) 
    { 
     // do something... 
    } 
} 

नीचे मेरी TestClass है। क्या मैं कुछ भूल रहा हूँ?

अग्रिम धन्यवाद!

+1

यह नहीं होगा कि 'SomeClass' में' MyMethod (string) 'की परिभाषा नहीं है, जो ऐसा लगता है कि ऐसा नहीं है। –

+0

क्षमा करें..मैंने अपना प्रश्न संपादित किया .. – user591410

+1

आप सही रास्ते पर हैं, लेकिन पोस्ट कोड में बग हैं। यह संकलित नहीं होगा - कुछ क्लास पर आवरण, DoSomething पर शून्य वापसी। उसके बाद आपको सार्वजनिक पहुंच की आवश्यकता है, फिर DoSomething वर्चुअल बनाएं। संक्षेप में आपके पास शायद आपके उत्पादन कोड में भी एक बग है। – TrueWill

उत्तर

81

आप गलत विधि की जांच कर रहे हैं। Moq की आवश्यकता है कि आप निर्भरता वर्ग में विधि सेटअप (और फिर वैकल्पिक रूप से सत्यापित करें)।

तुम कुछ इस तरह अधिक करना चाहिए:

class MyClassTest 
{ 
    [TestMethod] 
    public void MyMethodTest() 
    { 
     string action = "test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 

     mockSomeClass.Setup(mock => mock.DoSomething()); 

     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 

     // Explicitly verify each expectation... 
     mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); 

     // ...or verify everything. 
     // mockSomeClass.VerifyAll(); 
    } 
} 

दूसरे शब्दों में, आप सत्यापित कर रहे है कि MyClass#MyMethod बुला, अपने वर्ग निश्चित रूप से SomeClass#DoSomething एक बार इस प्रक्रिया में कॉल करेंगे। ध्यान दें कि आपको Times तर्क की आवश्यकता नहीं है; मैं बस इसका मूल्य दिखा रहा था।

+0

क्षमा करें, मैंने सही प्रश्न के साथ अपना प्रश्न संपादित किया। जैसा कि आपने बताया है, मैंने पहले सेटअप को आजमाया और फिर सत्यापित किया। यह अभी भी मुझे एक ही अपवाद देता है। – user591410

+0

मैंने आपके प्रश्नों को आपके द्वारा सुझाए गए सुझावों के साथ अपडेट किया, लेकिन यहां तक ​​कि यह मुझे एक ही अपवाद देता है .. कृपया सलाह दें। – user591410

+0

समझ गया .. धन्यवाद .. मैं इसे स्थापित करते समय विधि के तर्कों को गलत बना रहा था। – user591410

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