我有一个简单的应用程序,想尝试使用TDD进行开发。我以前从未使用过TDD,直到我发现了ASP.NET-MVC才知道它是什么。(我的第一个MVC应用程序有单元测试,但它们很脆弱、紧密耦合、需要太多维护,并被放弃了——我已经学会了单元测试!= TDD)。
应用程序背景:
我有一个采购订单的文本转储,读入为字符串。我需要解析文本并返回新的采购订单号、新的行项目编号、旧的采购订单号和旧的采购订单行号。非常简单。
现在我只在处理新的采购订单详细信息(编号/行),并且有一个像这样的模型:
这很容易,但允许公共setter和无参数构造函数似乎是一个糟糕的妥协。因此,另一种选择是在构造函数中输入'purchaseOrderText'值,但这样我也要测试'GetNewNumber'和'GetNewLine'的代码。
我有点困惑如何编写可测试的类,同时尝试保持其符合模型所需的限制。这似乎是一个常见的问题,所以我认为我可能是忽略了一个明显的概念。
应用程序背景:
我有一个采购订单的文本转储,读入为字符串。我需要解析文本并返回新的采购订单号、新的行项目编号、旧的采购订单号和旧的采购订单行号。非常简单。
现在我只在处理新的采购订单详细信息(编号/行),并且有一个像这样的模型:
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”都不为空时才应该返回true。因此,我想这样测试它:
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);
}
这很容易,但允许公共setter和无参数构造函数似乎是一个糟糕的妥协。因此,另一种选择是在构造函数中输入'purchaseOrderText'值,但这样我也要测试'GetNewNumber'和'GetNewLine'的代码。
我有点困惑如何编写可测试的类,同时尝试保持其符合模型所需的限制。这似乎是一个常见的问题,所以我认为我可能是忽略了一个明显的概念。