【问题标题】:Unit testing private methods and using mock objects单元测试私有方法和使用模拟对象
【发布时间】:2013-08-21 10:51:44
【问题描述】:

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

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

【问题讨论】:

  • 嗯,首先要注意的是,不测试私有方法是,好吧,礼貌地说,hooey。你测试你需要测试的东西。我的一般做法是将需要测试的方法公开为protected,然后创建一个子类来访问这些方法。

标签: c# unit-testing


【解决方案1】:

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

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

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

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

【讨论】:

  • 请将您的代码添加到问题中。这种方式不可读。在使用外部依赖项时,您应该查看模拟和依赖项注入。我写了一篇关于它的文章,你可以在wouterdekort.blogspot.nl/2012/03/…找到
猜你喜欢
  • 1970-01-01
  • 2014-06-07
  • 2017-07-24
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多