2010-05-04 19 views
5

मैं कुछ मौजूदा वर्गों से तर्क का परीक्षण करने की कोशिश कर रहा हूं। वर्तमान में कक्षाओं को फिर से कारक बनाना संभव नहीं है क्योंकि वे बहुत ही जटिल और उत्पादन में हैं।राइनो मोक्स आंशिक मॉक

मैं जो करना चाहता हूं वह एक मॉक ऑब्जेक्ट बनाता है और एक ऐसी विधि का परीक्षण करता है जो आंतरिक रूप से किसी अन्य विधि को कॉल करता है जो नकली करने के लिए बहुत मुश्किल है।

तो मैं केवल माध्यमिक विधि कॉल के लिए एक व्यवहार निर्धारित करना चाहता हूं।

लेकिन जब मैं विधि के लिए व्यवहार स्थापित करता हूं, तो विधि का कोड लागू होता है और विफल रहता है।

क्या मुझे कुछ याद आ रहा है या कक्षा के पुन: फैक्टर किए बिना परीक्षण करना संभव नहीं है?

मैं सभी विभिन्न नकली प्रकार (स्ट्रिक, स्टब, गतिशील, आंशिक ect।) की कोशिश की है लेकिन वे सभी विधि बुला अंत जब मैं व्यवहार स्थापित करने के लिए प्रयास करें।

using System; 
using MbUnit.Framework; 
using Rhino.Mocks; 

namespace MMBusinessObjects.Tests 
{ 
    [TestFixture] 
    public class PartialMockExampleFixture 
    { 
     [Test] 
     public void Simple_Partial_Mock_Test() 
     { 
      const string param = "anything"; 

      //setup mocks 
      MockRepository mocks = new MockRepository(); 


      var mockTestClass = mocks.StrictMock<TestClass>(); 

      //record beahviour *** actualy call into the real method stub *** 
      Expect.Call(mockTestClass.MethodToMock(param)).Return(true); 

      //never get to here 
      mocks.ReplayAll(); 

      //this is what i want to test 
      Assert.IsTrue(mockTestClass.MethodIWantToTest(param)); 


     } 

     public class TestClass 
     { 
      public bool MethodToMock(string param) 
      { 
       //some logic that is very hard to mock 
       throw new NotImplementedException(); 
      } 

      public bool MethodIWantToTest(string param) 
      { 
       //this method calls the 
       if(MethodToMock(param)) 
       { 
        //some logic i want to test 
       } 

       return true; 
      } 
     } 
    } 
} 

उत्तर

14

MethodToMock वर्चुअल नहीं है और इसलिए इसका मज़ाक उड़ाया नहीं जा सकता है। क्या आप क्या करना चाहते एक आंशिक नकली के साथ संभव है (मैं आपसे मिलते-जुलते मामलों में यह किया है), लेकिन विधि तुम बाहर उपहास करने के लिए एक अंतरफलक कार्यान्वयन के दोनों भाग या आभासी रूप में चिह्नित किया होना चाहिए चाहते हैं। अन्यथा, आप इसे Rhino.Mocks के साथ नकली नहीं कर सकते हैं।

+0

पूरी तरह से याद किया गया - आप बिल्कुल सही हैं। – tvanfosson

+0

बस जोड़ने के लिए आप एक इंटरफेस से आंशिक नकली उत्पन्न नहीं कर सकते हैं। मॉक किए जाने वाले तरीकों को वास्तव में वर्चुअल चिह्नित किया जाना चाहिए। –

1

मैं परीक्षण के अंतर्गत कक्षा में नहीं मजाक तरीकों सलाह देते हैं, लेकिन अपनी स्थिति आप में अनूठा आप वर्ग refactor नहीं कर सकते हैं यह आसान वर्तमान में परीक्षण करने के लिए बनाने के लिए हो सकता है। कॉल सेट अप करते समय विधि को लागू होने से रोकने के लिए आप स्पष्ट रूप से प्रतिनिधि बनने का प्रयास कर सकते हैं।

Expect.Call(delegate { mockTestClass.MethodToMock(param) }).Return(true); 

या, एएए सिंटैक्स का उपयोग करने के लिए स्विच करें, बहिष्कृत संरचनाओं को छोड़ दें।

[Test] 
    public void Simple_Partial_Mock_Test() 
    { 
     const string param = "anything"; 

     var mockTestClass = MockRepository.GenerateMock<TestClass>(); 

     mockTestClass.Expect(m => m.MethodToMock(param)).Return(true); 

     //this is what i want to test 
     Assert.IsTrue(mockTestClass.MethodIWantToTest(param)); 

     mockTestClass.VerifyAllExpectations(); 
    } 
+0

एएए वाक्य रचना ठीक काम करना चाहिए। इसका उपयोग करने के लिए +1। –

+0

आपकी मदद के लिए धन्यवाद, मैं करने की कोशिश की जो आपने कहा है, लेकिन इस सरल उदाहरण में यह अभी भी लाइन mockTestClass.Expect पर अपवाद फेंकता (एम => m.MethodToMock (परम)) .Return (सही); क्लासेस MethodToMock को कॉल करता है जो एक NotImplementedException फेंक देगा। –

+0

MethodToMock आभासी होना चाहिए – jannagy02

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