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?