构造函数是否注入TDD?

时间:2010-01-22 20:18:32

标签: c# unit-testing dependency-injection

我有一个方法,我正在尝试使用查询对象的单元测试,我想Stub这个查询对象用于我的单元测试。此查询对象确实具有依赖项(UnitOfWork)。我正在使用IOC / DI容器在应用程序中实例化我的对象。但是我不想在TDD时使用容器。我看到它的方式是我有两个选择:

  1. 将查询对象作为字段或属性添加到方法的类中,并将其作为ctor参数注入。但是这感觉不正确,因为此 1 方法是只有使用它的方法,如果我必须添加第二个使用此查询对象的方法,则必须在每次使用后重新实例化或重置该对象。
  2. 将查询对象添加到方法的签名中。嗅觉?
  3. 还有其他选择或图案吗?或者我接近错了?

    这是一些伪代码:

    选项#1

    public class OrdersController
    {
                public OrdersController(IOrderQuery query)
                {
                    this.query = query;
                }
    
                private readonly IOrderQuery query;
    
                public Queryable<Order> OrdersWaiting()
                {
                    var results = query(...);
                    ...
                }
    }
    

    选项#2

    public class OrdersController
    {
                public Queryable<Order> OrdersWaiting(IOrderQuery query)
                {
                    var results = query(...);
                    ...
                }
    }
    

    我的查询对象

    public class OrderQuery : IOrderQuery
    {
                public OrderQuery(IUnitOfWork unitOfWork)
                {
                    ...
                }
    }
    

2 个答案:

答案 0 :(得分:1)

肯定更喜欢选项1而不是选项2.看起来IOC容器有责任实例化/了解查询对象。调用者不必知道OrdersWaiting获取其数据的方式/位置的详细信息。

使用选项2,调用者不仅需要获取控制器的实例,还需要获取查询对象的实例,这可能超出了调用者的可见性。

答案 1 :(得分:1)

  

如果我必须添加一秒钟   使用此查询对象的方法,   对象必须是   每次重新实例化或重置   使用

如果这是阻止您在此处使用构造函数注入的原因,请考虑注入IOrderQueryFactory