2010-01-22 64 views
3

我有一个方法,我试图单元测试,使用查询对象,我想这个查询对象存根单元测试。这个查询对象确实有一个依赖关系(UnitOfWork)。我正在使用IOC/DI容器来在应用程序中实例化我的对象。不过,我不想在TDD时使用容器。我看到它的方式是我有两个选择:构造函数注入或不注入TDD?

  1. 查询对象添加到方法的类的字段或属性,并注入它作为一个构造函数参数。但是这并不正确,因为此方法是唯一会使用它的方法,如果我必须添加使用此查询对象的第二种方法,则必须重新实例化对象或每次使用后重置。
  2. 将查询对象添加到方法的签名中。闻?

是否还有其他选项或模式?或者我接近它错了?

下面是一些伪代码:

选项#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) 
      { 
       ... 
      } 
} 

回答

1

,如果我曾经有添加第二个 方法没有使用此查询对象, 对象必须是 重新实例或每个 使用后复位。

如果这是什么阻止你在这里使用构造函数注入,请考虑注入一个IOrderQueryFactory来代替。

+0

不错,其中一个啊!我的时刻。谢谢! – mxmissile 2010-01-22 20:31:00

1

肯定更喜欢选项1比选项2看起来好像是IOC容器的实例化/知道查询对象的责任。来电者不必知道OrdersWaiting获取数据的详细信息。

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

+0

选项1的问题是如果我需要在第二种方法中使用查询对象?我将不得不记住要重新创建它,或者以某种方式重置(),或者调用容器来获得新的容器。基本上我在说,我需要在每次使用时重新实例化它。 – mxmissile 2010-01-22 20:29:06