构造函数注入或不注入TDD?
问题描述:
我有一个方法,我试图单元测试,使用查询对象,我想这个查询对象存根单元测试。这个查询对象确实有一个依赖关系(UnitOfWork)。我正在使用IOC/DI容器来在应用程序中实例化我的对象。不过,我不想在TDD时使用容器。我看到它的方式是我有两个选择:构造函数注入或不注入TDD?
- 查询对象添加到方法的类的字段或属性,并注入它作为一个构造函数参数。但是这并不正确,因为此方法是唯一会使用它的方法,如果我必须添加使用此查询对象的第二种方法,则必须重新实例化对象或每次使用后重置。
- 将查询对象添加到方法的签名中。闻?
是否还有其他选项或模式?或者我接近它错了?
下面是一些伪代码:
选项#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)
{
...
}
}
答
,如果我曾经有添加第二个 方法没有使用此查询对象, 对象必须是 重新实例或每个 使用后复位。
如果这是什么阻止你在这里使用构造函数注入,请考虑注入一个IOrderQueryFactory
来代替。
答
肯定更喜欢选项1比选项2看起来好像是IOC容器的实例化/知道查询对象的责任。来电者不必知道OrdersWaiting
获取数据的详细信息。
使用选项2,调用者不仅需要获取控制器的实例,还需要获取查询对象的实例,这可能应该超出调用者的可见性。
+0
选项1的问题是如果我需要在第二种方法中使用查询对象?我将不得不记住要重新创建它,或者以某种方式重置(),或者调用容器来获得新的容器。基本上我在说,我需要在每次使用时重新实例化它。 – mxmissile 2010-01-22 20:29:06
不错,其中一个啊!我的时刻。谢谢! – mxmissile 2010-01-22 20:31:00