【发布时间】:2009-01-23 17:00:14
【问题描述】:
我有一个快速的小应用程序,想尝试使用 TDD 进行开发。在我找到 ASP.NET-MVC 之前,我从未使用过 TDD,实际上我什至不知道它是什么。 (我的第一个 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”都为非空时才为真。所以我想像这样测试它:
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”的代码。
对于如何将其编写为可测试的类,同时试图将其锁定在对模型有意义的方面,我有点难过。这似乎是一个常见问题,所以我想我只是缺少一个明显的概念。
【问题讨论】:
标签: c# asp.net-mvc unit-testing tdd