У меня небольшое приложение, и я хотел попробовать разработать его с использованием TDD. Я никогда не использовал TDD и даже не знал, что это такое, пока не нашел ASP.NET-MVC. (Мое первое приложение MVC имело модульные тесты, но они были хрупкими, сильно связаны, занимали слишком много времени и были заброшены - я пришел изучать модульные тесты! = TDD).
Фон в приложении:
У меня есть текстовый дамп заказа на покупку, считанный в виде строки. Мне нужно проанализировать текст и вернуть новый номер заказа на покупку, новый номер позиции, старый номер заказа на покупку, старый номер строки заказа на покупку. Довольно просто.
Сейчас я работаю только над новыми деталями заказа на покупку (номер / строка), и у меня есть такая модель:
public class PurchaseOrder
{
public string NewNumber {get; private set;}
public string NewLine {get; private set;}
new public PurchaseOrder(string purchaseOrderText)
{
NewNumber = GetNewNumber(purchaseOrderText);
NewLine = GetNewLine(purchaseOrderText);
}
// ... definition of GetNewNumber / GetNewLine ...
// both return null if they can't parse the text
}
Теперь я хочу добавить метод «IsValid», который должен быть истинным, только если «NewNumber» и «NewLine» не равны NULL. Поэтому я хочу проверить это как:
public void Purchase_Order_Is_Valid_When_New_Purchase_Order_Number_And_Line_Number_Are_Not_Null()
{
PurchaseOrder order = new PurchaseOrder()
{
NewNumber = "123456",
NewLine = "001"
};
Assert.IsTrue(order.IsValid);
}
Это достаточно просто, но кажется плохим компромиссом, позволяющим использовать открытые сеттеры и конструктор без параметров. Таким образом, альтернатива состоит в том, чтобы ввести значение «purchaseOrderText» в конструкторе, но затем я также тестирую код для «GetNewNumber» и «GetNewLine».
Я немного озадачен тем, как написать это как тестируемый класс, пытаясь сохранить его в терминах того, что имеет смысл для модели. Похоже, это будет распространенной проблемой, поэтому я думаю, что просто упускаю очевидную концепцию.