.net - 使用依赖注入(inject),我发现自己创建了工厂来进行单元测试。这是正常的吗?

标签 .net unit-testing testing dependency-injection mocking

检查以下简化的示例代码:

public class RequestManager
{
    public RequestManager()
    {

    }

    public void ProcessRequest(byte[] data)
    {
        IRequest request = new Request(data);
        request.Send();
    }
}

当我发现自己可以使用这段代码来测试它时,我以:

public class RequestManager
{
    private IRequestFactory requestFactory;

    public RequestManager(IRequestFactory requestFactory)
    {
        this.requestFactory = requestFactory;
    }

    public void ProcessRequest(byte[] data)
    {
        IRequest request = this.requestFactory.CreateRequest(data);
        request.Send();
    }
}

CreateRequest 方法只有新的 Request(data),所以我可以模拟工厂并返回一个模拟。

问题是我开始有很多工厂来处理如此简单的任务,我想知道这是否正常,或者是否有一种模式或其他方法可以帮助我克服这个问题。

有什么想法吗?提前致谢。

最佳答案

这不仅是正常的,而且是体面设计的标志。在正确应用 DI 的应用程序中,您不需要工厂:

  • 从依赖注入(inject)容器解析的对象
  • POCO/DTO(因为它们是简单的值(value)存储)
  • 在大多数情况下,.NET BCL 对象(尽管这可能会有所不同)

对于其他一切,工厂是一个不错的选择。为什么?

  • 它提供了统一的对象创建方式(这样整个团队都知道当你需要IRequest实例时,你应该注入(inject)IRequestFactory)
  • 它不会引发任何不必要的问题(例如“我应该在创建后设置 SomeProperty 吗?”“我使用哪个构造函数?Factory.CreateInstance()简单而直观——无需解释任何东西,所有的决定都已经做出并嵌入在工厂本身中)
  • 结合模拟,它大大简化了单元测试(尤其是当无法轻易使用假数据创建实际对象时)

撇开单元测试不谈,当您在 3、6、12 个月后返回您的代码时,前两点具有极大的好处 - 工厂减轻开发人员对事物的决策这不需要首先做出任何决定。

不用担心要使用哪个构造函数要传递什么参数,您有一个非常简单的契约(Contract)可以回答所有可能的问题,作为开发人员,您可以专注于实际问题。

关于.net - 使用依赖注入(inject),我发现自己创建了工厂来进行单元测试。这是正常的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407231/

相关文章:

c# - 谁取消了我的任务?

.net - 页面加载时 Gridview 不显示

python - 在运行 Django 单元测试时,例如在 PyCharm 中,强制删除任何先前的测试数据库(autoclobber)

testing - 在生产系统中测试账户和产品

在没有真实硬件的情况下使用 libusb 测试应用程序

c# - JSON 解析问题 - 'S' 是 JSON 中无效的可转义字符

c# - 如何在C#中创建基于多命令结果组合的策略决策机制

unit-testing - SailsJS : How to properly unit test controllers?

angular - 如何在 NgRx-Effects 中测试多个 withLatestFrom store 注入(inject)?

python - 每种测试方法都有不同的设置/拆卸