2014-07-07 9 views
6

nicel I bu satır kodu kullanmak bir sınıf (tüm IRepository arayüzü) taklit zaman moq.dll kullanıyorum

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

ancak bu durumda tüm fonksiyonu taklit

depo sınıfında. Nasıl sınıfı depoda Sonra bütün yöntemleri

Sınıf deposundan (gerçek sınıf) ve mock sadece bir işlev tanımlanan tüm yöntemleri kullanmak istediğiniz Mock dll yöntemleri kurulum ile ikame edilir (Savestate)

olabilir Ben bunu yapıyorum? Mümkün?

+0

Birden fazla kez sağa basabilirsiniz rep.etup edebilirsiniz? – Liath

+1

SaveState 'virtual' mü? – DaveShaw

+1

SaveState sanal değil. Liath neden birden çok kez ayarlandı? Sadece bu yöntem için kurulum kullanmak istiyorum. diğer yöntemler gerçek dünya – user3401335

cevap

16

Böyle, daha sonra kurulum ile geçersiz kılabilirsiniz istenen arayüz elde etmek As<>() kullanmak sonra, gerçek depo örneğini oluşturabilir: Sonra

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

mockRep.Object için depo bağımlılık olarak test edilen sınıf. Yalnızca bu şekilde Interface * yöntemlerini veya sanal yöntemleri birleştirme yöntemleri olduğunu unutmayın.

Güncelleme: .Setup sadece sanal yöntem üzerinde çalışıyor ve C# arayüz uygulamaları "virtual" and sealedby default olduğundan * Bu, tüm senaryolarda çalışmayabilir. Ve As() kullanarak kısmi mock davranışını önleyecektir.

yüzden kısmi sahte başarılı olmak için RealRepository beton sınıfı bu durumda CallBase tel-up için kullanılabilir, sırayla sanal yöntemlerle IRepository arabirimini uygulamak gerekir anlaşılmaktadır.

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(); 
     } 
    } 
İlgili konular