2014-07-07 19 views
6

sto usando moq.dll Quando mi prendo gioco di una classe (tutta l'interfaccia IRepository) Io uso questo codice lineamoq solo un metodo in una classe

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

ma in questo caso mi prendo gioco tutte le funzioni in classe repository. Allora tutti i metodi di repository di classe sono sostituiti con la messa a punto metodi di dll Mock

voglio utilizzare tutti i metodi definiti nel repository di classe (la classe reale) e finta una sola funzione (SaveState)

Come si può Lo faccio? È possibile?

+0

Sai che puoi chiamare rep.Setup più volte giusto? – Liath

+1

SaveState 'virtuale'? – DaveShaw

+1

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

risposta

16

È 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(); 
     } 
    } 
Problemi correlati