C# 单元测试私有方法和使用模拟对象
互联网上充斥着这样的页面:我们不应该为私有方法编写单元测试用例。但是我不确定我们是否应该完全忽略单元测试用例的私有方法?我知道如果我们测试主要的公共方法,它们最终会被测试。但是想象一下,我的方法命中数据库并从数据集中填充对象,它包含在一个私有方法中。如果我想对我的数据库使用mock,我必须为此方法编写一个单元测试用例,这将迫使我将其公开。我如何克服这种情况 因为下面是我的公共方法,如果我为它编写一个单元测试用例,它每次都会命中数据库。这是我想要避免的,因为数据库是一个我总是想模仿的外部依赖项。使用DB的另一个问题是,假设我正在从我的单元测试用例中硬编码一个sysid,它将一直工作到sysid存在于DB中为止。当该记录从数据库中删除时,测试用例将变得无用C# 单元测试私有方法和使用模拟对象,c#,unit-testing,C#,Unit Testing,互联网上充斥着这样的页面:我们不应该为私有方法编写单元测试用例。但是我不确定我们是否应该完全忽略单元测试用例的私有方法?我知道如果我们测试主要的公共方法,它们最终会被测试。但是想象一下,我的方法命中数据库并从数据集中填充对象,它包含在一个私有方法中。如果我想对我的数据库使用mock,我必须为此方法编写一个单元测试用例,这将迫使我将其公开。我如何克服这种情况 因为下面是我的公共方法,如果我为它编写一个单元测试用例,它每次都会命中数据库。这是我想要避免的,因为数据库是一个我总是想模仿的外部依赖项。使
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和单元测试这样的事情的目标是得到一个遵循这些原则的解决方案 首先要注意的是,不测试私有方法是,礼貌地说,好极了。你测试你需要测试的东西。我的一般方法是将需要测试的方法公开为
受保护的,然后创建一个子类来访问这些方法。首先要注意的是,不测试私有方法是,礼貌地说,胡说八道。你测试你需要测试的东西。我的一般方法是将需要测试的方法公开为受保护的方法,然后创建一个子类来访问这些方法。请将您的代码添加到问题中。这样就不可读了。当处理外部依赖项时,您应该考虑模拟和依赖项注入。我写了一篇关于它的文章,你可以在“请将你的代码添加到问题中”上找到。这样就不可读了。当处理外部依赖项时,您应该考虑模拟和依赖项注入。我写了一篇关于它的文章,你可以在