单元测试私有方法并使用模拟对象

时间:2013-08-21 10:51:44

标签: c# unit-testing

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

因为下面是我的公共方法,如果我写一个单元测试用例,那么每次都会遇到数据库。我想避免,因为数据库是一个外部依赖,我总是想模仿。使用DB的另一个问题是假设我从我的单元测试用例中硬编码一个sysid,直到sysid存在于db中时它才会工作。当从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;           
 }

1 个答案:

答案 0 :(得分:4)

测试私有方法过分依赖于类的实现。你说你通过公共方法测试一个类是正确的。如果你有一个做很多工作的私有方法,你应该把它移到自己的类。

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

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

TDD和单元测试等目标是达到遵循SOLID原则的解决方案。