我有一个快速的小应用程序,想尝试使用 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”均为非空时该方法才应为 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);
}
这很容易,但允许公共设置器和无参数构造函数似乎是一个糟糕的妥协。因此,另一种方法是在构造函数中输入“purchaseOrderText”值,但随后我也会测试“GetNewNumber”和“GetNewLine”的代码。
我对如何将其编写为可测试类感到困惑,同时试图将其锁定在对模型有意义的方面。这似乎是一个常见问题,所以我想我只是错过了一个明显的概念。
一种解决方案是不让构造函数完成这项工作:
public class PurchaseOrder
{
public PurchaseOrder(string newNumber, string newLine)
{
NewNumber = newNumber;
NewLine = newLine;
}
// ...
}
那么测试就变得简单且隔离——你不是在测试GetNewNumber
and GetNewLine
同时。
为了帮助使用PurchaseOrder
您可以创建一个将它们组合在一起的工厂方法:
public static PurchaseOrder CreatePurchaseOrder(string purchaseOrderText)
{
return new PurchaseOrder(
GetNewNumber(purchaseOrderText),
GetNewLine(purchaseOrderText));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)