Как к методам тестирования, которые называют другие методы в объекте области

При работе с Объектами области, как обычно делают Вас модульный тест метод, который называет другой метод в объекте? Например:

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 верен.

Как другие люди обрабатывают это? Я не думаю, что имеет смысл разделять объект области, так как эти методы и рассматривают, часть базовой функциональности Счета (и разделение его, вероятно, заставило бы разработчиков называть неправильный метод чаще).

Спасибо!

5
задан Andrew 28 January 2010 в 08:58
поделиться

2 ответа

Я бы выстроил ситуацию, которая максимально проста: только одна InvoiceLine с Количеством и Ценой 1.

Что-то вроде этого:

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

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

Когда вы обнаружите, что эта штука становится довольно сложной, найти ошибки становится сложно и т.д., то это признак того, что вы должны разделить класс (сделать вычисления по счету-фактуре стратегией или чем-то подобным). Но пока он такой же простой, как и ваш код, я бы не стал об этом беспокоиться.

1
ответ дан 15 December 2019 в 01:01
поделиться

Вы можете сделать методом GetTotalamt виртуальный , а затем:

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

var result = sut.GetExtendedTotalAmt();
3
ответ дан 15 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: