Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试中模拟对象的正确应用_Unit Testing_Mocking_Moq - Fatal编程技术网

Unit testing 单元测试中模拟对象的正确应用

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(...

我有一个PresenterFactory,它根据角色参数创建Presenter类。具体来说,角色参数是一个我无法控制的外部类(即第三方)

我的工厂看起来像这样:

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的答案,即围绕角色对象编写一个包装器类。