我的公司正在进行单元测试,我在重构服务层代码方面遇到了一些麻烦。下面是我编写的一些代码的示例:
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个类,因为大多数私有方法实际上只是实现细节,不值得单独测试。