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测试数据加载方法的主要内容,如果未能解决你的问题,请参考以下文章