2014-07-07 7 views
6

मैं moq.dll उपयोग कर रहा हूँ जब मैं एक वर्ग (सभी IRepository इंटरफेस) नकली मैं इस लाइन कोड का उपयोगएक वर्ग में केवल एक ही विधि moq

int state = 5; 
    var rep = new Mock<IRepository>(); 
    rep.Setup(x => x.SaveState(state)).Returns(true); 
    IRepository repository = rep.Object; 

लेकिन इस मामले में मैं सभी समारोह नकली भंडार वर्ग में। तब सभी वर्ग भंडार में तरीकों नकली dll

मैं सभी तरीकों वर्ग भंडार (वास्तविक वर्ग) और नकली केवल एक समारोह में परिभाषित का उपयोग करना चाहते करने के तरीकों सेटअप के साथ प्रतिस्थापित कर रहे हैं (savestate)

कैसे कर सकते हैं मैं यह करता हूँ? संभव है? करने के लिए भंडार निर्भरता के रूप में

var mockRep = new Mock<RealRepository>(ctorArg1, ctorArg2, ...) 
        .As<IRepository>(); 
mockRep.Setup(x => x.SaveState(state)).Returns(true); 

फिर mockRep.Object:

+0

आपको पता है कि आप rep.Setup कई बार सही कॉल कर सकते हैं? – Liath

+1

क्या SaveState 'virtual' है? – DaveShaw

+1

सेवस्टेट आभासी नहीं है। लीथ क्यों कई बार प्रतिनिधि सेट? मैं केवल इस विधि के लिए सेटअप का उपयोग करना चाहता हूं। अन्य विधियों को असली दुनिया – user3401335

उत्तर

16

आप इस तरह, वास्तविक भंडार का एक उदाहरण बना सकते हैं तो As<>() का उपयोग वांछित इंटरफ़ेस है, जो आप तो सेटअप के साथ ओवरराइड कर सकते हैं प्राप्त करने के लिए, परीक्षण के तहत कक्षा। ध्यान दें कि आप इस तरह से Interface *, या वर्चुअल विधियों पर केवल मॉक विधियों को सक्षम करने में सक्षम होंगे।

अद्यतन: * यह सभी स्थितियों में काम नहीं कर सकते क्योंकि .Setup केवल आभासी तरीकों पर काम करेंगे, और सी # इंटरफेस कार्यान्वयन "virtual" and sealedby default हैं। और As() का उपयोग आंशिक नकली व्यवहार को रोक देगा।

तो ऐसा लगता है कि RealRepository ठोस वर्ग, जिसमें मामले CallBase तार-अप के लिए इस्तेमाल किया जा सकता है, के लिए आंशिक नकली सफल होने के लिए आदेश में आभासी तरीकों के साथ IRepository इंटरफ़ेस को लागू करने की आवश्यकता होगी।

public interface IRepo 
    { 
     string Foo(); 
     string Bar(); 
    } 

    public class RealRepo : IRepo 
    { 
     public RealRepo(string p1, string p2) {Console.WriteLine("CTOR : {0} {1}", p1, p2); } 
     // ** These need to be virtual in order for the partial mock Setups 
     public virtual string Foo() { return "RealFoo"; } 
     public virtual string Bar() {return "RealBar"; } 
    } 

    public class Sut 
    { 
     private readonly IRepo _repo; 
     public Sut(IRepo repo) { _repo = repo; } 

     public void DoFooBar() 
     { 
     Console.WriteLine(_repo.Foo()); 
     Console.WriteLine(_repo.Bar()); 
     } 
    } 


    [TestFixture] 
    public class SomeFixture 
    { 
     [Test] 
     public void SomeTest() 
     { 
     var mockRepo = new Mock<RealRepo>("1st Param", "2nd Param"); 
     // For the partially mocked methods 
     mockRepo.Setup(mr => mr.Foo()) 
      .Returns("MockedFoo"); 
     // To wireup the concrete class. 
     mockRepo.CallBase = true; 
     var sut = new Sut(mockRepo.Object); 
     sut.DoFooBar(); 
     } 
    } 
संबंधित मुद्दे