代码之家  ›  专栏  ›  技术社区  ›  Andrew

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

  •  5
  • Andrew  · 技术社区  · 15 年前

    在处理域对象时,通常如何对调用对象中其他方法的方法进行单元测试?例如:

    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()时,我必须使用stub/mock invoiceline对象使其工作,我真正想做的是测试如果isdiscounted标志为true,是否应用折扣。

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

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Stefan Steinegger    15 年前

    InvoiceLine

    invoice.Add(new InvoiceLine(new Article("blah", 1M), 1));
    
    Assert.AreEqual(0.95M, invoice.GetExtendedTotalAmt());
    

        2
  •  3
  •   Darin Dimitrov    15 年前

    GetTotalAmt virtual

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