我的公司正在进行单元测试,我在重构服务层代码方面遇到了一些麻烦。下面是我编写的一些代码的示例:

public class InvoiceCalculator:IInvoiceCalculator
{
   public CalculateInvoice(Invoice invoice)
   {
      foreach (InvoiceLine il in invoice.Lines)
      {
          UpdateLine(il);
      }
      //do a ton of other stuff here
   }

   private UpdateLine(InvoiceLine line)
   {
      line.Amount = line.Qty * line.Rate;
      //do a bunch of other stuff, including calls to other private methods
   }
}

在这个简单的例子中(它从一个1000行的类中减少了1个公共方法和大约30个私有方法),我的老板说我应该能够分别测试我的calculateInvoice和updateLine(updateLine实际上调用了3个其他私有方法,并执行了数据库调用)。但我该怎么做呢?他建议的重构对我来说有点复杂:
//Tiny part of original code
public class InvoiceCalculator:IInvoiceCalculator
{
   public ILineUpdater _lineUpdater;

   public InvoiceCalculator (ILineUpdater lineUpdater)
   {
      _lineUpdater = lineUpdater;
   }

   public CalculateInvoice(Invoice invoice)
   {
      foreach (InvoiceLine il in invoice.Lines)
      {
          _lineUpdater.UpdateLine(il);
      }
      //do a ton of other stuff here
   }
}

public class LineUpdater:ILineUpdater
{
   public UpdateLine(InvoiceLine line)
   {
      line.Amount = line.Qty * line.Rate;
      //do a bunch of other stuff
   }
}

我可以看到依赖关系现在是如何被破坏的,我可以测试这两个部分,但这也会从我原来的类中创建20-30个额外的类。我们只在一个地方计算发票,所以这些零件不会真正重复使用。这是做出改变的正确方法吗,还是建议我做一些不同的事情?
谢谢您!
杰西

最佳答案

这一切都取决于updateline()方法的“重要性”。如果它只是一个实现细节(例如,它很容易被内联到calculateInvoice()方法中,而它们唯一会伤害的是可读性),那么您可能不需要将它与主类分开进行单元测试。
另一方面,如果updateline()方法对业务逻辑有一些价值,如果您可以想象需要独立于类的其他部分更改此方法(因此需要单独测试它)的情况,那么您应该继续将其重构为单独的lineupdater类。
您可能不会以这种方式得到20-30个类,因为大多数私有方法实际上只是实现细节,不值得单独测试。

08-06 05:46