2014-09-18 7 views
5

मैं Moq का उपयोग कर किया गया है और यह प्यार है, लेकिन मैं कुछ विरासत कोड मजाक एक समस्या का सामना करना पड़ा (इससे पहले कि मैं इसे दूर refactor करने की कोशिश) के साथ,क्या मैं एक मोक मॉक कार्यान्वयन की प्रतिलिपि बना सकता हूं?

क्या मैं सच में करना चाहते हैं दो अलग-अलग mocks है केवल थोड़ा अलग कार्यान्वयन, जैसे नीचे नमूना।

 Mock<IFoo> fooMock = new Mock<IFoo>(); 
     fooMock.SetupGet(f => f.bar).Returns(7); 
     fooMock.SetupGet(f => f.bar2).Returns(3); 
     Mock<IFoo> fooMockClone = new Mock<IFoo>(fooMock.Behavior); 
     fooMockClone.SetupGet(f => f.bar).Returns(9); 

     Debug.Assert(7 == fooMock.Object.bar); 
     Debug.Assert(9 == fooMockClone.Object.bar); 
     Debug.Assert(3 == fooMockClone.Object.bar2); 
     Debug.Assert(3 == fooMock.Object.bar2); 

यह एक साधारण उदाहरण है लेकिन वास्तविक कोड दर्जनों तरीकों के साथ एक वस्तु है और मैं दो संस्करणों के लिए थोड़ा अलग कार्यान्वयन चाहता हूं।

धन्यवाद

+0

आपका प्रश्न भ्रामक लगता है - आप दूसरी fooMock सेटअप और दूसरे दावे से एक कॉपी-पेस्ट "whoopsie" क्या ज़रूरत थी? –

+0

आप बिल्कुल सही हैं। मैंने किया। फिक्स्ड। धन्यवाद :) –

+0

रुको, क्या आप सिर्फ एक मॉक ऑब्जेक्ट चाहते हैं जिसका मूल्य हर बार जब आप इसे एक्सेस करते हैं या कुछ बदलते हैं? –

उत्तर

1

मैं इस मामले तो में आश्चर्य है आप व्यवहार परीक्षण के लिए देख रहे हैं। मशीन में एक नमूना है। Moq sublayer के साथ आता है ... यह घोंसले की अनुमति देता है जैसा कि आप चाहते हैं, परीक्षणों के तार्किक अलगाव को बनाए रखते हुए। NuGet पैकेज आवश्यक है: Machine.Fakes.Moq,

class IFoo_test_context : WithSubject<IFoo> 
{ 
    Establish context =() => Subject.bar2 = 3; 
} 

class When_fooing_with_seven : IFoo_test_context 
{ 
    Establish context =() => Subject.bar = 7; 

    It bar_should_be_seven =()=> Subject.bar.ShouldEqual(7); 
    It bar2_should_be_three =()=> Subject.bar.ShouldEqual(3); 
} 

class When_fooing_with_nine : IFoo_test_context 
{ 
    Establish context =() => Subject.bar = 9; 

    It bar_should_be_nine =() => Subject.bar.ShouldEqual(9); 
    It bar2_should_be_three =() => Subject.bar.ShouldEqual(3); 
} 

Machine.Specifications.Should फिर उदाहरण के लिए कुछ हद तक मूर्खतापूर्ण है क्योंकि यह मजाक व्यवहार का परीक्षण कर रहा है, लेकिन यह क्या आप अंततः पूरा करने के लिए कोशिश कर रहे हैं देखने के लिए मुश्किल है। जहां तक ​​मैं कह सकता हूं, मॉक के साथ जिस तरह से आप चाहते हैं उसमें कोई कॉपी कन्स्ट्रक्टर नहीं है।

+0

मैंने आपके संशोधन के साथ अपना उदाहरण कॉपी किया, और यह 2014-09-18 के अनुसार NuGet से Moq 4.2.1409.1722 में काम किया। –

+0

मेरा मानना ​​है कि fooMock.Behaviour सिर्फ वापस लौटाता है यदि नकली मॉकबैवियर के साथ बनाया गया था। सख्त, लूज या डिफॉल्ट (मैंने थोड़ा सा स्पष्ट रूप से दिखाने के लिए अपना भयानक उदाहरण अपडेट किया। क्षमा करें ...) –

+0

मैंने अपना जवाब अपडेट कर लिया है मूल संपादन के लिए आपके संपादन के आधार पर। –

0

आप कार्यान्वयन के विवरणों का नकल नहीं करते हैं, तो आप मूल्यों का नकल करते हैं ताकि आप अपने कोड में एक बिंदु प्राप्त कर सकें जिसे आपको परीक्षण करने की आवश्यकता है। एक परीक्षण लिखने में कोई बात नहीं है जो परीक्षण करता है कि एक मॉक निर्भरता एक मूल्य का उत्पादन करती है, तो आप बस moq का परीक्षण कर रहे हैं।

पूर्व:

public class Stuff { 
    IFoo _foo; 
    IBar _bar; 
    public Stuff(IFoo foo, IBar bar){ 
     _foo = foo; 
     _bar = bar; 
    } 
    public void DoStuff() { 
     if(_foo.HasFooage) { 
      _bar.Bar = 4; 
     } 
    } 
} 

फिर अपने परीक्षण होगा:

... 
public void test_bar_does_bar() { 
    var foo = new Mock<IFoo>(); 
    foo.Setup(f => f.HasFooage).Returns(true); 
    var bar = new Mock<IBar>(); 
    var stuff = new Stuff(foo.Object, bar.Object); 

    stuff.DoStuff(); 

    Assert.That(bar.Bar, Is.EqualTo(4)); 
} 
+1

मुझे विश्वास है कि आप इस बिंदु को चूक गए हैं। ओपी ने उस समस्या को उस बिंदु तक दूर करने की कोशिश की जहां एक संक्षिप्त उत्तर दिया जा सकता था। – Michael

+0

अपने आप से यह पूछें: debock.assert करने का क्या मतलब है कि आपके मॉक ऑब्जेक्ट में वह मान है जो आपने विशेष रूप से इसे स्थापित करने के लिए सेट किया है ...? –

+0

मैं उस ऑब्जेक्ट को उस विधि में पास करना चाहता हूं जिसे मैं परीक्षण कर रहा हूं और परीक्षण करता हूं कि जिस मान को सेट किया गया है, वह अपेक्षित है। SetProperty का उपयोग करके यह थोड़ा स्पष्ट हो सकता है कि इसे बाद में सेट किया जाएगा। मैं खोज रहा हूं कि मेरा उदाहरण कई तरीकों से भयानक था। –

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

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