1

我有一个 PresenterFactory,它基于 Role 参数创建 Presenter 类。具体来说,角色参数是我无法控制的外部类(IE 3rd 方。)

我的工厂看起来像这样:

public class PresenterFactory {
    public Presenter CreatePresenter(Role role, ...) {
        if (role.IsUserA("Manager")) {
            return new ManagerPresenter(...)
        }
        if (role.IsUserA("Employee")) {
            return new EmployeePresenter(...)
        }
    }
}

我被困在如何为此编写单元测试,因为创建Role对象会强制访问数据库。我以为我可以模拟这个对象。我的测试看起来像这样:

public void TestPresenterFactory()
{
    var mockRole = new Mock<Role>();

    mockRole .Setup(role=> role.IsUserA("Manager"))
        .Returns(true)
        .AtMostOnce();

    PresenterFactory.CreatePresenter(mockRole.Object, ...);

    mockUserInfo.VerifyAll();
}

但是我收到一个ArguementException

不可覆盖成员上的无效设置:role=> role.IsUserA("Manager")

我不确定去哪里,当然可以使用一些课程修正。我究竟做错了什么?

4

4 回答 4

2

您可以为 Role 创建一个包装器对象,该对象具有所有相同的方法和属性,但可模拟,并且默认实现仅返回底层 Role 的实现。

然后您的测试可以使用包装角色来设置所需的行为。

这通常是一种绕过真正需要模拟的具体类的方法。

于 2009-07-14T22:52:03.370 回答
0

您要模拟的是创建一个 Role 对象,然后将该模拟对象传递给您的 CreatePresenter 方法。在模拟中,您可以设置确定用户类型所需的任何属性。如果此时您仍然依赖于数据库,那么您可能会考虑重构您的 Role 对象。

于 2009-07-14T22:50:39.267 回答
0

考虑使用一个模拟框架,该框架不会对必须如何编写可模拟的代码施加人为约束(例如要求虚拟方法、不密封类等)。我在 .NET 上下文中知道的唯一示例是 TypeMock。

于 2009-07-14T22:55:01.617 回答
0

在 Java 中,当使用 EasyMock 扩展时,您将能够模拟“真实”的对象和方法,很可能有等效或替代的模拟框架可以用于您的目的

于 2009-07-14T22:58:20.330 回答