如何测试调用域对象中其他方法的方法

时间:2010-01-28 08:58:02

标签: c# .net unit-testing

使用域对象时,您通常如何对调用对象中另一个方法的方法进行单元测试?例如:

public class Invoice
{
  public IList<InvoiceLine> InvoiceLines;
  public string Company;
  public bool IsDiscounted;
  public DateTime InvoiceDate;
  //...
  public GetTotalAmt();
  public GetExtendedTotalAmt();

  public decimal GetTotalAmt()
  {
    decimal total;
    foreach (InvoiceLine il in InvoiceLines)
    {
      total += il.Qty * il.Price;
    }
    return total;
  }

  public decimal GetExtendedTotalAmt()
  {
    decimal discount;
    if (IsDiscounted)
      discount = .05M; 
    return GetTotalAmt() * discount;
  }
}

单元测试GetTotalAmt()很简单,但是使用GetExtendedTotalAmt()我必须使用存根/模拟InvoiceLine对象使其工作,当我真正想做的是测试如果IsDiscounted标志应用折扣是真的。

其他人如何处理这个问题?我不认为拆分域对象是有意义的,因为这些方法都被认为是核心发票功能的一部分(并且拆分它可能会导致开发人员更频繁地调用错误的方法)。

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以制作GetTotalAmt方法virtual然后:

var sut = new MockRepository().PartialMock<Invoice>();
sut.Expect(x => x.GetTotalAmt()).Return(10);
sut.Replay();

var result = sut.GetExtendedTotalAmt();

答案 1 :(得分:1)

我会建立一个尽可能简单的情况:只有一个InvoiceLine,数量和价格为1.

这样的事情:

invoice.Add(new InvoiceLine(new Article("blah", 1M), 1));

Assert.AreEqual(0.95M, invoice.GetExtendedTotalAmt());

当你发现这些东西变得非常复杂,发现错误变得困难等等,那么这就是你应该拆分类的一个标志(使发票上的计算成为一种策略或类似的东西)。但只要它就像你在这里的代码一样简单,我就不用担心了。