Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TDD测试数据加载方法_C#_Unit Testing_Tdd - Fatal编程技术网

C# TDD测试数据加载方法

C# TDD测试数据加载方法,c#,unit-testing,tdd,C#,Unit Testing,Tdd,我是TDD新手,我想知道如何测试以下代码 我试图先编写测试,但在创建涉及我的DataAccessor的测试时遇到了麻烦。我想不出怎么伪装它。我已经完成了扩展Shipping类并重写Load()方法的步骤;继续测试对象。我感觉好像我最终对模拟对象/存根进行了单元测试,而不是对真实对象进行了单元测试。我认为在TDD中,单元测试应该命中对象上的所有方法;但是,我似乎永远无法测试Load()代码,只能测试覆盖的模拟负载 我的测试是编写一个对象,该对象包含基于装运编号的订单列表 我有一个从数据库加载自己的

我是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的存根实现

另一种方法是在构造函数中传递订单。谢谢您提供的信息。我将使用第一个,希望它能提高我的可测试性。是的,我做了那些受保护的,这样我就可以在我的假对象中弄脏它们。。。我猜那可能是个糟糕的练习。