Я пытаюсь изучить TDD, применяя его к простому моему проекту. Некоторые детали (и более ранний вопрос) здесь:
TDD: Помощь в написании тестируемого класса
Специфика в том, что у меня есть класс PurchaseOrderCollection, у которого есть закрытый список PurchaseOrders (передан в конструктор), а у PurchaseOrders есть логическое свойство IsValid. PurchaseOrderCollection имеет свойство HasErrors, которое возвращает значение true, если для любого элемента PurchaseOrders в списке значение IsValid равно false. Это логика, которую я хочу проверить.
[TestMethod]
public void Purchase_Order_Collection_Has_Errors_Is_True_If_Any_Purchase_Order_Has_Is_Valid_False()
{
List<PurchaseOrder> orders = new List<PurchaseOrder>();
orders.Add(new PurchaseOrder(--some values to generate IsValid false--));
orders.Add(new PurchaseOrder(--some values to generate IsValid true--));
PurchaseOrderCollection collection = new PurchaseOrderCollection(orders);
Assert.IsTrue(collection.HasErrors);
}
Это похоже на мой предыдущий вопрос в том, что этот тест слишком связан, так как я должен знать логику того, что делает PurchaseOrder IsValid ложным или истинным, чтобы пройти тест, когда на самом деле этот тест не должен волновать. Вопрос другой (имо) в том, что сами классы не проблема.
По сути, я хочу иметь возможность объявить PurchaseOrder, для которого IsValid имеет значение false или true, не зная ничего о том, что такое PurchaseOrder.
Из моего ограниченного знания TDD, это то, что вы используете заглушки или издевательства. Мой главный вопрос, это правильно? Или я должен использовать другой метод для этого? Или я совершенно испорчен и просто пишу этот тест и думаю о нем неправильно?
Первоначально я думал о том, чтобы просто использовать какую-то фиктивную инфраструктуру и создать PurchaseOrder, который всегда возвращает true или false. Из того, что я прочитал, мне нужно объявить IsValid виртуальным. Поэтому моей второй мыслью было изменить его, добавив IPurchaseOrder в качестве интерфейса для PurchaseOrder и просто создать поддельный PurchaseOrder, который всегда возвращает false или true. Являются ли обе эти действительные идеи?
Спасибо!