C# TDD测试数据加载方法
我是TDD新手,我想知道如何测试以下代码 我试图先编写测试,但在创建涉及我的DataAccessor的测试时遇到了麻烦。我想不出怎么伪装它。我已经完成了扩展Shipping类并重写Load()方法的步骤;继续测试对象。我感觉好像我最终对模拟对象/存根进行了单元测试,而不是对真实对象进行了单元测试。我认为在TDD中,单元测试应该命中对象上的所有方法;但是,我似乎永远无法测试Load()代码,只能测试覆盖的模拟负载 我的测试是编写一个对象,该对象包含基于装运编号的订单列表 我有一个从数据库加载自己的对象C# TDD测试数据加载方法,c#,unit-testing,tdd,C#,Unit Testing,Tdd,我是TDD新手,我想知道如何测试以下代码 我试图先编写测试,但在创建涉及我的DataAccessor的测试时遇到了麻烦。我想不出怎么伪装它。我已经完成了扩展Shipping类并重写Load()方法的步骤;继续测试对象。我感觉好像我最终对模拟对象/存根进行了单元测试,而不是对真实对象进行了单元测试。我认为在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);
}
}
公共类装运
{
//成员变量
受保护列表_listOfOrders=新列表();
受保护字符串_id=“”
//公共财产
公开名单
{
获取{return}listOfOrders;}
}
公共装运(字符串id)
{
_id=id;
加载();
}
//问题方法
//每当我编写需要此装运对象的代码时,此方法都会尝试
//去打DB和Fubar我的测试
//唯一的解决办法就是让我所有的测试都在一个假的装运对象上运行。
受保护的空荷载()
{
_listOfOrders=DataAccessor.GetOrders(_id);
}
}
我创建了一个假的Shipping类来测试其余的类方法。如果没有实际的DB连接,我永远无法测试真实的load方法
public class FakeShipment : Shipment
{
protected new void Load()
{
_listOfOrders = new List<string>();
}
}
公共类假货:装运
{
受保护的新空心荷载()
{
_listOfOrders=新列表();
}
}
有什么想法吗?请告知
戴夫成功了
public Shipment(DataAccessor da, string id)
{
_da = da;
_id = id;
Load();
}
protected void Load()
{
_listOfOrders = _da.GetOrders(_id);
}
DataAccessor
应该是一个接口
顺便说一句,那些受保护的数据成员闻起来像腐烂的鱼。我假设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的存根实现 另一种方法是在构造函数中传递订单。谢谢您提供的信息。我将使用第一个,希望它能提高我的可测试性。是的,我做了那些受保护的,这样我就可以在我的假对象中弄脏它们。。。我猜那可能是个糟糕的练习。