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();
}
}
Birden fazla kez sağa basabilirsiniz rep.etup edebilirsiniz? – Liath
SaveState 'virtual' mü? – DaveShaw
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