如何解决为真实对象创建代理
我想使用真实存储库编写集成测试,同时验证存储库的行为
SomeService(IRepository r)
调用 r.QuerySomething()
我一直在尝试使用 Moq 来实现这一目标:
var mock = new Mock<IRepository >(() => new Repository());
mock.CallBase = true;
问题在于它从不调用 Repository 中的方法,也不调用它的构造函数。那里的 lambda 用于获取 ctor 参数(如果类型是类),而不是用于对象初始化。
问:如何将 new Repository()
包装到 Mock<IIRepository>
中以便验证调用?
注意:如果类型 give 是一个类,它就可以工作,但我不能用它来验证,因为它们实现不是虚拟的。
或者,是否还有其他一些 nuget 可以帮助我实现这一目标?
解决方法
我使用一种技术来测试棕色文件遗留代码,它可能对您想要实现的目标有所帮助。您可以在测试项目中引入一个装饰器,该装饰器包装您的原始实现,但也实现了 IRepository
接口。
class TestRepository : IRepostiory
{
public TestRepository(Repository next)
{
this.next = next;
}
}
在这个类中,您可以将所有 interface
成员声明为 virtual
。
class TestRepository : IRepostiory
{
public virtual IReadOnlyList<Client> GetByName(string name)
{
return this.next.GetByName(name);
}
}
现在您可以使用 TestRepository
代替原始实现,还可以创建一个模拟来验证对此类的调用。
var repository = new Repository();
var sutMock = new Mock<TestRepository>(repository) { CallBase = true };
var sut = sutMock.Object;
sut.GetByName("John Doe");
sutMock.Verify(x => x.GetByName("John Doe"),Times.Once);
注意:您需要遗留代码测试技术这一事实可能表明存在代码异味。作为第一步,我建议将断言模拟的测试与断言真实实现结果的测试(持久层中的更改)分开。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。