我的公司在单元测试中,我在重构服务层代码时遇到了一些问题。下面是一些代码,我写了一个例子:重构服务层类
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
}
}
在这个简化的情况下(这是从有1分公共法和〜30倍私立学校的1000线类下降),我的老板说我应该能够分别测试我的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额外的课程。我们只在一个地方计算发票,因此这些部分不会真正可重复使用。这是做出这个改变的正确方法,还是你建议我做一些不同的事情?
谢谢!
Jess
我们所有的实体对象基本都是DTO,所以所有的业务逻辑都在服务类中。但是在发票行计算器中有很多其他逻辑,我只是展示了一件。 – 2010-01-24 21:19:19