moq only one method in a class

c#, moq

Solution

You can create an instance of the real repository, then use the `As<>()` to obtain the desired interface, which you can then override with the setup, like this:

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

Then `mockRep.Object` as the repository dependency to the class under test. Note that you will only be able to Mock methods on the `Interface`*, or virtual methods, in this way.

Update : *This might not work in all scenarios, since `.Setup` will only work on virtual methods, and C# interface implementations are "virtual" and sealed by default. And using `As()` will prevent the partial mock behaviour.

So it appears that the `RealRepository` concrete class will need to implement the `IRepository` interface with virtual methods in order for the partial mock to succeed, in which case `CallBase` can be used for the wire-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();
      }
   }

Problem

I'm using moq.dll When I mock a class(all the IRepository interface) i use this line code ``` int state = 5; var rep = new Mock<IRepository>(); rep.Setup(x => x.SaveState(state)).Returns(true); IRepository repository = rep.Object; ``` but in this case i mock all the function in repository class. Then all the methods in class repository are substituted with the methods setup of Mock dll I want use all the methods defined in class repository(the real class) and mock only one function(SaveState) How can I do this? Is possible?

Original source

Related problems