单元测试私人二传手问题(C#)

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即可.


Bea*_*692 7

由于您正在检查订单的行为,因此可以使用模拟对象作为其项目.使用模拟对象,您可以定义关于模拟对象将要发生的事情的断言并对其进行测试.在这种情况下,您可以为每个项定义两个模拟对象,并期望它们的id getter将被调用并返回一个唯一值.然后您可以测试Order行为并检查item的id getter是否按预期调用.我建议使用Ayende的Rhino Mocks