Hello,
I have a quick little application and wanted to give a try to develop using TDD. I've never used TDD and actually didn't even know what it was until I found ASP.NET-MVC. (My first MVC app had unit tests, but they were brittle, way coupled, took too much up keep, and were abandoned -- I've come to learn unit tests != TDD).
Background on app:
I have a text dump of a purchase order read in as a string. I need to parse the text and return new purchase order number, new line item number, old purchase order number, old purchase order line number. Pretty simple.
Right now I'm only working on new purchase order details (number/line) and have a model like this:
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
}
Now I want to add a method "IsValid" that should only be true if "NewNumber" and "NewLine" are both non-null. So I want to test it like:
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);
}
This is easy enough, but it seems like a bad compromise to allow public setters and a parameterless constructor. So the alternative is to feed in a 'purchaseOrderText' value in the constructor, but then I'm testing the code for 'GetNewNumber' and 'GetNewLine' as well.
I'm kind of stumped on how to write this as a testable class while trying to keep it locked up in terms of what makes sense for the model. This seems like it would be a common problem, so I'm thinking I'm just missing an obvious concept.