TDD测试数据加载方法

Posted

技术标签:

【中文标题】TDD测试数据加载方法【英文标题】:TDD test data loading methods 【发布时间】:2011-01-24 19:33:30 【问题描述】:

我是一名 TDD 新手,我想弄清楚如何测试以下代码。

我正在尝试先编写测试,但在创建涉及我的 DataAccessor 的测试时遇到了麻烦。我不知道如何伪造它。我已经扩展了货件类并覆盖了 Load() 方法;继续测试对象。我觉得好像我最终对我的 Mock 对象/存根而不是我的真实对象进行了单元测试。我认为在 TDD 中,单元测试应该针对对象上的所有方法;但是我似乎永远无法测试 Load() 代码只有覆盖的模拟负载

我的测试是编写一个对象,其中包含基于发货编号的订单列表。

我有一个从数据库中加载自身的对象。

public class Shipment

 //member variables
 protected List<string> _listOfOrders = new List<string>();
 protected string _id = "" 

 //public properties
 public List<string> ListOrders
 
    get return _listOfOrders; 
 

 public Shipment(string id)
 
     _id = id;
     Load();
 

 //PROBLEM METHOD
 // whenever I write code that needs this Shipment object, this method tries
 // to hit the DB and fubars my tests
 // the only way to get around is to have all my tests run on a fake Shipment object. 
 protected void Load()
 
     _listOfOrders = DataAccessor.GetOrders(_id);
 



我创建了我的假装运类来测试其余的类方法。如果没有实际的数据库连接,我永远无法测试 Real load 方法

public class  FakeShipment : Shipment


 protected new void Load()
 
     _listOfOrders = new List<string>();
 



有什么想法吗?请指教。

戴夫

【问题讨论】:

【参考方案1】:

我假设 DataAccessor 当前是一个静态类。 第一步是通过创建一个接口为 DataAccessor 创建一个抽象。

IDataAccessor

那么你有两个选择,让 IDataAccessor 成为构造函数依赖,如下所示:

public class Shipment

  private readonly IDataAccessor dataAccessor; 
  public Shipment(IDataAccessor dataAccessor) 
  
    this.dataAccessor = dataAccessor;  
  

或者使用下图的Double Dispatch方式:

 public void Load(IDataAccessor dataAccessor)
 
     _listOfOrders = dataAccessor.GetOrders(_id);
 

然后在您的单元测试中,您将使用 IDataAccessor 的存根实现。

【讨论】:

另一种方法是在构造函数中传入订单。 感谢您的信息。我将使用第一个并希望它提高我的可测试性。【参考方案2】:

做起来

 public Shipment(DataAccessor da, string id)
 
     _da = da;
     _id = id;
     Load();
 

 protected void Load()
 
     _listOfOrders = _da.GetOrders(_id);
 

DataAccessor 应该是一个接口。

顺便说一句,那些受保护的数据成员闻起来像烂鱼。

【讨论】:

是的,我将它们设置为受保护的,这样我就可以在我的假物品中弄脏它们......我猜这可能是一种糟糕的做法。

以上是关于TDD测试数据加载方法的主要内容,如果未能解决你的问题,请参考以下文章

Junit TDD

如何使用 MongoDB 和 Mongoid 在 Rails 3 上进行适当的数据库测试 (TDD)

如何在目标 c 中模拟类方法以与 TDD 一起使用

TDD 单元测试子方法

TDD:您为单元测试公开了哪些方法?

饮食、睡眠和呼吸单元测试/TDD/BDD [关闭]