ano*_*ous 6 c# tdd asp.net-mvc unit-testing
我有一个快速的小应用程序,并想尝试使用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
}
Run Code Online (Sandbox Code Playgroud)
现在我想添加一个方法"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);
}
Run Code Online (Sandbox Code Playgroud)
这很容易,但是允许公共setter和无参数构造函数似乎是一个糟糕的折衷方案.所以另一种方法是在构造函数中输入'purchaseOrderText'值,但之后我也在测试'GetNewNumber'和'GetNewLine'的代码.
我有点难以理解如何将其作为一个可测试的类写入,同时试图将其锁定在对模型有意义的方面.这似乎是一个常见的问题,所以我想我只是错过了一个明显的概念.
一种解决方案是不让构造函数完成工作:
public class PurchaseOrder
{
public PurchaseOrder(string newNumber, string newLine)
{
NewNumber = newNumber;
NewLine = newLine;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后,测试是很简单的孤立-你不测试GetNewNumber
,并GetNewLine
在同一时间.
为了帮助PurchaseOrder
您使用,您可以创建一个将它组合在一起的工厂方法:
public static PurchaseOrder CreatePurchaseOrder(string purchaseOrderText)
{
return new PurchaseOrder(
GetNewNumber(purchaseOrderText),
GetNewLine(purchaseOrderText));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
842 次 |
最近记录: |