Cal*_*bHC 7 c# tdd unit-testing
我正在尝试测试名为AddItem的Order实体方法,并且我正在尝试确保无法添加重复项.这是一些示例代码:
[Test]
public void ItemCannotBeAddedTwiceToOrder()
{
Order o = new Order();
Item i = new Item("Bike");
o.AddItem(i);
o.AddItem(i);
Assert.AreEqual(o.ItemCount, 1, "A duplicate item was added.");
}
public void AddItem(Item newItem)
{
if(!CheckForDuplicateItem(newItem))
_items.Add(newItem);
}
public bool CheckForDuplicateItem(Item newItem)
{
foreach(Item i in _items)
{
if(i.Id == newItem.Id)
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题:如何在测试方法中设置新Item的私有setter Id,以便CheckForDuplicateItem方法可以工作?我想,我不想让那个成员公开进行良好的编码实践.我只是愚蠢,需要让实体项目有一个公共ID设置器?或者我需要使用反射?谢谢
注意 - 我正在使用NHibernate进行持久化
Pra*_*yan 10
我通常会为此目的使用反射.这样的东西会起作用:
typeof(Item).GetProperty("Id").SetValue(i, 1, null);
Run Code Online (Sandbox Code Playgroud)
其中1是您要为newItem实例设置的ID.
根据我的经验,你很少需要设置Id,所以最好只保留setter私有.在少数情况下,您需要设置Id以进行测试,只需使用Reflection即可.
由于您正在检查订单的行为,因此可以使用模拟对象作为其项目.使用模拟对象,您可以定义关于模拟对象将要发生的事情的断言并对其进行测试.在这种情况下,您可以为每个项定义两个模拟对象,并期望它们的id getter将被调用并返回一个唯一值.然后您可以测试Order行为并检查item的id getter是否按预期调用.我建议使用Ayende的Rhino Mocks
| 归档时间: |
|
| 查看次数: |
3200 次 |
| 最近记录: |