我正在尝试通过将 TDD 应用于我的一个简单项目来学习它。一些细节(和更早的问题)在这里:
具体是我有一个 PurchaseOrderCollection 类,它有一个私有的 PurchaseOrders 列表(在构造函数中传递),并且 PurchaseOrders 有一个布尔属性 IsValid。PurchaseOrderCollection 有一个属性 HasErrors,如果列表中的任何 PurchaseOrders 的 IsValid 为 false,则该属性返回 true。这是我要测试的逻辑。
[TestMethod]
public void Purchase_Order_Collection_Has_Errors_Is_True_If_Any_Purchase_Order_Has_Is_Valid_False()
{
List<PurchaseOrder> orders = new List<PurchaseOrder>();
orders.Add(new PurchaseOrder(--some values to generate IsValid false--));
orders.Add(new PurchaseOrder(--some values to generate IsValid true--));
PurchaseOrderCollection collection = new PurchaseOrderCollection(orders);
Assert.IsTrue(collection.HasErrors);
}
这与我之前的问题类似,因为该测试过于耦合,因为我必须知道使 PurchaseOrder IsValid 为假或真以通过测试的逻辑,而实际上该测试不应该关心。问题是不同的(imo),因为类本身不是问题。
本质上,我希望能够声明一个 IsValid 为 false 或 true 的 PurchaseOrder,而不需要更多地了解 PurchaseOrder 是什么。
根据我有限的 TDD 知识,这是您使用 Stubs 或 Mocks 的目的。我的主要问题,这是正确的吗?或者我应该为此使用不同的方法吗?还是我完全有缺陷,只是在写这个测试并认为它是错误的?
我最初的想法是只使用某种模拟框架并创建一个始终返回 true 或 false 的 PurchaseOrder。从我读过的内容来看,我需要声明 IsValid 虚拟。所以我的第二个想法是更改它以添加 IPurchaseOrder 作为 PurchaseOrder 的接口,并创建一个始终返回 false 或 true 的假 PurchaseOrder。这两个都是有效的想法吗?
谢谢!