0

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

因为下面是我的公共方法,如果我为此编写一个单元测试用例,它每次都会命中数据库。我想避免,因为数据库是我一直想模拟的外部依赖项。使用 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;           
 }
4

1 回答 1

4

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

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

在您的示例中,为什么读取数据库并填充您的对象的代码不是一个单独的类?单一职责原则指出一个类应该只有一个单一职责。这个新类可以注入到原来的类中,遵循依赖倒置原则。

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

于 2013-08-21T10:56:40.637 回答