Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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

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# 单元测试私有方法和使用模拟对象_C#_Unit Testing - Fatal编程技术网

C# 单元测试私有方法和使用模拟对象

C# 单元测试私有方法和使用模拟对象,c#,unit-testing,C#,Unit Testing,互联网上充斥着这样的页面:我们不应该为私有方法编写单元测试用例。但是我不确定我们是否应该完全忽略单元测试用例的私有方法?我知道如果我们测试主要的公共方法,它们最终会被测试。但是想象一下,我的方法命中数据库并从数据集中填充对象,它包含在一个私有方法中。如果我想对我的数据库使用mock,我必须为此方法编写一个单元测试用例,这将迫使我将其公开。我如何克服这种情况 因为下面是我的公共方法,如果我为它编写一个单元测试用例,它每次都会命中数据库。这是我想要避免的,因为数据库是一个我总是想模仿的外部依赖项。使

互联网上充斥着这样的页面:我们不应该为私有方法编写单元测试用例。但是我不确定我们是否应该完全忽略单元测试用例的私有方法?我知道如果我们测试主要的公共方法,它们最终会被测试。但是想象一下,我的方法命中数据库并从数据集中填充对象,它包含在一个私有方法中。如果我想对我的数据库使用mock,我必须为此方法编写一个单元测试用例,这将迫使我将其公开。我如何克服这种情况

因为下面是我的公共方法,如果我为它编写一个单元测试用例,它每次都会命中数据库。这是我想要避免的,因为数据库是一个我总是想模仿的外部依赖项。使用DB的另一个问题是,假设我正在从我的单元测试用例中硬编码一个sysid,它将一直工作到sysid存在于DB中为止。当该记录从数据库中删除时,测试用例将变得无用

public Order RetrieveOrderAndOrderItem()
{
   DataSet ordersDS = new DataSet();
   Order obj = new Order();
   OrdersDb.RetrieveOrders(conKey,companySysId,userSysId,orderId,ordersDS);
   obj = populateObjFromDb(ordersDS,orderItemId, orderItemSubType);
   return obj;
}

 private Order populateObjFromDb(DataSet orders,int orderItemId, int orderItemSubType)
 {
    Order orderObj = new Order();
    orderObj.OrderId = Converters.DBInt(orders.Tables[0].Rows[0]["OrderId"]);
    return orderObj;           
 }

测试私有方法在很大程度上依赖于类的实现。您通过类的公共方法测试类是正确的。如果您有一个做大量工作的私有方法,您应该将它移动到它自己的类中

当您发现自己处于想要测试私有方法的情况下,您应该开始考虑您的设计

在您的示例中,为什么读取数据库并填充对象的代码不是一个单独的类?单一责任原则规定一个类应该只有一个单一的责任。这个新类可以注入到原始类中,从而遵循依赖性反转原则


像TDD和单元测试这样的事情的目标是得到一个遵循这些原则的解决方案

测试私有方法在很大程度上依赖于类的实现。您通过类的公共方法测试类是正确的。如果您有一个做大量工作的私有方法,您应该将它移动到它自己的类中

当您发现自己处于想要测试私有方法的情况下,您应该开始考虑您的设计

在您的示例中,为什么读取数据库并填充对象的代码不是一个单独的类?单一责任原则规定一个类应该只有一个单一的责任。这个新类可以注入到原始类中,从而遵循依赖性反转原则


像TDD和单元测试这样的事情的目标是得到一个遵循这些原则的解决方案

首先要注意的是,不测试私有方法是,礼貌地说,好极了。你测试你需要测试的东西。我的一般方法是将需要测试的方法公开为
受保护的
,然后创建一个子类来访问这些方法。首先要注意的是,不测试私有方法是,礼貌地说,胡说八道。你测试你需要测试的东西。我的一般方法是将需要测试的方法公开为受保护的方法,然后创建一个子类来访问这些方法。请将您的代码添加到问题中。这样就不可读了。当处理外部依赖项时,您应该考虑模拟和依赖项注入。我写了一篇关于它的文章,你可以在“请将你的代码添加到问题中”上找到。这样就不可读了。当处理外部依赖项时,您应该考虑模拟和依赖项注入。我写了一篇关于它的文章,你可以在