1

设置Web 服务时,我可以让它使用存储库类来获取数据以发送回客户端。如果我需要对服务执行的逻辑进行单元测试,我可以在其中注入对虚假存储库的引用,该存储库返回少量硬编码数据对象以避免调用数据库。

然而,在客户端,假设我有一个基于 MVC 的 Web 应用程序,它通过服务代理调用此 Web 服务。 如果我想对 MVC 应用程序中的逻辑进行单元测试并为其提供代表服务返回内容的数据,我该如何伪造代理引用? 因此,我的想法是,尽管我对此没有 100% 的信心,并且想知道我是否会错过一个更简单的解决方案:

我可以设置一个代理接口(我们称之为IProxy),然后设置它的两个具体实现(比如说,ProxyFakeProxy)并注入一个适合正在执行的情况的一个(运行单元测试时的 FakeProxy 和 Proxy for实际生产应用)。为了在不进行实际服务调用的情况下为单元测试生成一些示例数据,我是否应该在假代理中实现一个假存储库(可能与上述服务器场景中使用的相同)? 我不确定如何最好地设置一个假代理类来帮助测试我的客户端代码。

更新:

我同意到目前为止发布的答案,但我已经考虑了他们的观点,所以让我提供一些示例 C# 代码来说明我为什么要问这个问题。如果我在代理设计中留下一个假存储库,我的假代理可能看起来像这个非常简单的人为示例:

public class FakeCustomerProxy : ICustomerProxy
{
    private List<Customer> Customers;

    public FakeProxy()
    {
        Customers = new List<Customer>();

        Customers.Add(new Customer { Id = 1, Name = "Smith, John" });
        Customers.Add(new Customer { Id = 2, Name = "Johnson, Al" });
        Customers.Add(new Customer { Id = 3, Name = "Thomas, William" });
    }

    public Customer GetById(int customerId)
    {
        return Customers.Where(c => c.Id == customerId).FirstOrDefault();
    }
}

GetById ()方法不是调用 Web 服务来获取所需的客户信息,而是简单地从嵌入在此类中的硬编码客户列表中返回它。这真的开始类似于我可能为假存储库设置的内容(我什至可能在服务器端设置了看起来非常相似的代码来帮助测试服务逻辑),所以我很好奇是否应该考虑放置这些硬编码的客户引用到一个专用的假存储库类以在多个地方使用。 我可能在考虑这个 Fake Proxy 的设计完全错误吗?

4

2 回答 2

2

不,为虚假 Web 服务代理设置虚假存储库对于单元测试来说似乎不是一个好主意。

实际上,通常只需要一个假的(代理或存储库)就足够了。

我建议您查看模拟框架(例如MoqRhino Mock)。
使用模拟,您甚至不需要FakeProxy实现。在每个测试中,您可以轻松设置单独的模拟实现,IProxy其将完全按照您的需要执行:返回预定义数据、引发异常、验证传递的参数等。

因此,您不需要实现 1 或 2 个假类进行测试。

更新:
所以,我在这里看到 2 个选项:

  1. 拥有不可重复使用的简单测试数据,这些数据特定于每个特定的测试。您可能需要为每个测试或测试组设置类似迷你存储库(大约 1-3 个项目)之类的东西;

  2. 拥有足够大的可重用虚假存储库,这对于服务器端和客户端代码都很常见。您很可能需要支持一些额外的工具来在客户端测试和服务器端测试中使用这个假存储库。例如,您需要FakeProxy额外测试客户端代码。

您应该考虑这些选项并选择更适合您的情况。

在我看来,选项 1 适用于单元测试,但选项 2 可能对集成测试有用。

于 2013-03-28T15:57:22.133 回答
0

不,您不应该在测试中重复实施存储库代理连接。代理外观和存储库之间迟早会有一些业务逻辑,您将不得不实现它两次 - 在服务器端和客户端,在 FakeProxy 中。

因此,您的 FakeProxy 模拟实例应该只从调用中返回原始数据。

另一方面,您可以在客户端测试中导入真正的代理类,并模拟存储库进行测试,但这将是一个集成测试,而不是单元测试,并且会涉及在客户端测试中使用服务器端代码,这不是总是可能的。

于 2013-03-28T15:56:41.697 回答