Unit testing 单元测试中模拟对象的正确应用
我有一个PresenterFactory,它根据角色参数创建Presenter类。具体来说,角色参数是一个我无法控制的外部类(即第三方) 我的工厂看起来像这样:Unit testing 单元测试中模拟对象的正确应用,unit-testing,mocking,moq,Unit Testing,Mocking,Moq,我有一个PresenterFactory,它根据角色参数创建Presenter类。具体来说,角色参数是一个我无法控制的外部类(即第三方) 我的工厂看起来像这样: public class PresenterFactory { public Presenter CreatePresenter(Role role, ...) { if (role.IsUserA("Manager")) { return new ManagerPresenter(...
public class PresenterFactory {
public Presenter CreatePresenter(Role role, ...) {
if (role.IsUserA("Manager")) {
return new ManagerPresenter(...)
}
if (role.IsUserA("Employee")) {
return new EmployeePresenter(...)
}
}
}
public void TestPresenterFactory()
{
var mockRole = new Mock<Role>();
mockRole .Setup(role=> role.IsUserA("Manager"))
.Returns(true)
.AtMostOnce();
PresenterFactory.CreatePresenter(mockRole.Object, ...);
mockUserInfo.VerifyAll();
}
由于创建角色
对象会强制数据库访问,因此我一直在研究如何为此编写单元测试。我想我可以嘲笑这个物体。我的测试是这样的:
public class PresenterFactory {
public Presenter CreatePresenter(Role role, ...) {
if (role.IsUserA("Manager")) {
return new ManagerPresenter(...)
}
if (role.IsUserA("Employee")) {
return new EmployeePresenter(...)
}
}
}
public void TestPresenterFactory()
{
var mockRole = new Mock<Role>();
mockRole .Setup(role=> role.IsUserA("Manager"))
.Returns(true)
.AtMostOnce();
PresenterFactory.CreatePresenter(mockRole.Object, ...);
mockUserInfo.VerifyAll();
}
public void TestPresenterFactory()
{
var mockRole=new Mock();
mockRole.Setup(role=>role.IsUserA(“管理者”))
.Returns(true)
.AtMostOnce();
PresenterFactory.CreatePresenter(mockRole.Object,…);
mockUserInfo.VerifyAll();
}
但是,我收到一个参数异常
:
不可重写成员上的设置无效:role=>role.IsUserA(“管理器”)
我不知道该去哪里,当然需要一些航向修正。我做错了什么?要模拟的是创建角色对象,然后将该模拟对象传递到CreatePresenter方法中。在mock上,您可以设置确定用户类型所需的任何属性。如果此时您仍然依赖于数据库,那么您可以考虑重构您的角色对象。您可以为角色创建一个包装器对象,该对象具有所有相同的方法和属性,但是可模拟的,默认实现只返回基础角色的实现 然后,您的测试可以使用包装器角色来设置所需的行为
这通常是绕过真正需要模拟的具体类的一种方法。考虑使用模拟框架,该框架不会对代码的可模拟性编写方式施加人为约束(例如要求方法是虚拟的,要求类不被密封等)。在.NET上下文中,我知道的唯一一个这样的例子是TypeMock 在Java中,当使用EasyMock扩展时,您将能够模拟“真实”对象和方法,很可能有一个等效或替代的模拟框架可以用于您的目的这就是我尝试的,但是在不可重写的成员上得到了无效的设置例外在这种情况下,我推荐womp的答案,即围绕角色对象编写一个包装器类。