c# – 单元测试和检查私有变量值

我用C#,NUnit和Rhino Mocks编写单元测试。
这里是我测试类的相关部分:

public class ClassToBeTested
{
    private IList<object> insertItems = new List<object>();

    public bool OnSave(object entity, object id)
    {
        var auditable = entity as IAuditable;
        if (auditable != null) insertItems.Add(entity);

        return false;            
    }
}

我想在调用OnSave后测试insertItems中的值:

[Test]
public void OnSave_Adds_Object_To_InsertItems_Array()
{
     Setup();

     myClassToBeTested.OnSave(auditableObject, null);

     // Check auditableObject has been added to insertItems array            
}

这是什么最好的做法?我考虑添加insertItems作为一个属性与公共get,或注入一个List到ClassToBeTested,但不确定我应该修改代码为测试的目的。

我已经阅读了很多关于测试私有方法和重构的帖子,但这是一个简单的类,我想知道什么是最好的选择。

快速的答案是,你永远不应该访问非公共成员从您的单元测试。它完全违背了拥有测试套件的目的,因为它锁定了你可能不想保持的内部实现细节。

更长的答案涉及到做什么?在这种情况下,重要的是要了解为什么实现是这样的(这就是为什么TDD是如此强大,因为我们使用测试来指定预期的行为,但我得到的感觉,你不使用TDD)。

在你的情况下,第一个问题是:“为什么IAuditable对象添加到内部列表中?或者换句话说,“这个实现的预期外部可见结果是什么?根据这些问题的答案,这是你需要测试。

如果将IAuditable对象添加到内部列表中,因为以后您想将它们写入审核日志(只是一个野生猜测),然后调用写入日志的方法,并验证期望的数据是否已写入。

如果将IAuditable对象添加到内部列表中,因为您想要收集证据以防某种后来的约束,那么请尝试测试。

如果您添加了没有可衡量原因的代码,则再次将其删除:)

重要的是,测试行为而不是实现是非常有益的。它也是一种更加健壮和可维护的测试形式。

不要害怕将您的被测系统(SUT)修改为更易于测试。只要你的添加在你的领域有意义,并遵循面向对象的最佳实践,没有问题 – you would just be following the Open/Closed Principle

http://stackoverflow.com/questions/1093020/unit-testing-and-checking-private-variable-value

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 单元测试和检查私有变量值