Как проверить методы, которые вызывают другие методы в доменном объекте - PullRequest
5 голосов
/ 28 января 2010

Когда вы работаете с объектами домена, как вы обычно тестируете метод, который вызывает другой метод в объекте? Например:

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-заглушки / макеты, чтобы заставить его работать, когда все, что я действительно хочу сделать, это проверить, что скидка применяется, если флаг IsDiscounts правда.

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Вы можете сделать GetTotalAmt метод virtual, а затем:

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

var result = sut.GetExtendedTotalAmt();
1 голос
/ 28 января 2010

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

Примерно так:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...