2010-03-08 77 views
4

我是一个TDD newb,我想弄清楚如何测试下面的代码。TDD测试数据加载方法

我想先写我的测试,但我有创建一个测试,触动了我DataAccessor麻烦。我无法弄清楚如何伪造它。我已经完成了货件类的扩展并覆盖了Load()方法;继续测试对象。我觉得好像我最终将单元测试我的Mock对象/存根,而不是我的真实对象。我认为在TDD中单元测试应该能够实现对象上的所有方法;不过,我可以似乎从来没有测试加载()代码只有重写模拟负载

我的测试编写包含基于关闭装运数量的订单列表的对象。

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

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); 
} 


} 

创建我的假冒货类来测试的类中的方法。我永远不能测试实际负载的方法,其余不具有实际DB连接

public class FakeShipment : Shipment 
{ 

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


} 

有什么想法?请指教。

戴夫

回答

3

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

IDataAccessor

然后,你有两个选择,让IDataAccessor一个构造函数依赖见下文:

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

或使用下面所示的双重分派方法:

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

然后在你的单位测试您将使用IDataAccessor的存根实现。

+0

另一种方法是在构造函数中传递订单。 – kyoryu 2010-03-08 01:09:36

+0

感谢您的信息。我打算和第一个一起去,希望它能提高我的可测试性。 – 2010-03-08 01:16:12

1

使其

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

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

DataAccessor应可能是一个接口。

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

+0

是的,我做这些受保护的,所以我可以在我的假对象与他们淤泥......我猜大概这就是可怕的做法。 – 2010-03-08 01:14:38