È possibile creare un'istanza del reale repository, quindi utilizzare il As<>()
per ottenere l'interfaccia desiderata, che è quindi possibile ignorare con l'installazione, in questo modo:
var mockRep = new Mock<RealRepository>(ctorArg1, ctorArg2, ...)
.As<IRepository>();
mockRep.Setup(x => x.SaveState(state)).Returns(true);
Poi mockRep.Object
come la dipendenza repository la classe sotto test Nota che in questo modo sarai in grado di simulare metodi solo su metodi Interface
* o virtuali.
Aggiornamento: * Questo potrebbe non funzionare in tutti gli scenari, dal momento che .Setup
funziona solo su virtuali metodi, e le implementazioni C# interfaccia sono "virtual" and sealedby default. E l'utilizzo di As()
impedirà il comportamento di simulazione parziale.
così sembra che la classe concreta RealRepository
sarà necessario implementare l'interfaccia IRepository
con metodi virtuali in modo che il mock parziali per avere successo, nel qual caso CallBase
può essere utilizzato per il filo-up.
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();
}
}
Sai che puoi chiamare rep.Setup più volte giusto? – Liath
SaveState 'virtuale'? – DaveShaw
SaveState non è virtuale. Liath perché impostare la ripetizione più volte? Voglio utilizzare l'installazione solo per questo metodo. gli altri metodi devono funzionare come il mondo reale – user3401335