我正在使用 moq.dll
当我模拟一个类(所有 IRepository 接口)时,我使用这行代码
int state = 5;
var rep = new Mock<IRepository>();
rep.Setup(x => x.SaveState(state)).Returns(true);
IRepository repository = rep.Object;
但在这种情况下,我模拟了存储库类中的所有函数。
然后将类存储库中的所有方法替换为 Mock dll 的方法设置
我想使用类存储库(真正的类)中定义的所有方法并仅模拟一个函数(SaveState)
我怎样才能做到这一点?有可能吗?
您可以创建真实存储库的实例,然后使用As<>()
获得所需的接口,然后您可以使用设置覆盖该接口,如下所示:
var mockRep = new Mock<RealRepository>(ctorArg1, ctorArg2, ...)
.As<IRepository>();
mockRep.Setup(x => x.SaveState(state)).Returns(true);
Then mockRep.Object
作为被测试类的存储库依赖项。
请注意,您只能模拟方法Interface
*,或者说虚方法,就是这样。
Update:*这可能不适用于所有情况,因为.Setup
只会工作在virtual方法和 C# 接口实现是“虚拟”和密封 https://stackoverflow.com/a/3621456/314291 默认情况下 https://stackoverflow.com/a/5386481/314291。并使用As()
将防止部分模拟行为。
所以看来RealRepository
具体类需要实现IRepository
与虚拟方法接口以便部分模拟成功,在这种情况下CallBase
可用于接线。
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();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)