C# 单元测试.验证列表计数



我想有一个测试用例,我可以验证随着新 IRule 项目的添加而增加的 IRule 计数列表。我正在测试的方法是AddRule。我想保持"规则"财产的私密性。

这是代码

public class DefaultRulesManager : IRulesManager
{
    private List<IRule> rules;
    public DefaultRulesManager()
    {
        rules = new List<IRule>();
    }
    public void AddRule(IRule rule)
    {
        if (rule == null)
        {
            throw new ArgumentNullException("rule must be set");
        }
        rules.Add(rule);
    }
    public bool HasPassed<T, SKU>(T obj, SKU s)
    {
        IProduct product = (IProduct)obj;
        return rules.All(x => x.HasPassed(product, s));
    }
}

您可以公开一个返回rules计数的Count只读属性:

public int RulesCount 
{
    get { return rules.Count; }
}

这里有各种选项:

    公开
  • 但安全地公开rules,例如通过ReadOnlyCollection<T>包装器或通过return rules.Select(r => r);作为IEnumerable<IRule>,以避免通过强制转换暴露实际列表。如果您不反对呼叫者知道管理器中的规则,只要他们不能修改列表,除非通过 AddRule ,这是合理的。
  • 在内部公开rules(最好通过属性 - 我不建议使用内部字段;我还会将该字段设为只读),并使用InternalsVisibleTo允许您的测试访问该字段。(如果你愿意,你可以只公开计数,但我不确定它是否特别有益。
  • 坚持测试公共 API - 您可以检查是否参考了您添加到列表中(在测试中)的所有规则。

就我个人而言,我可能会选择前一种选择 - 但有些人将"仅测试公共 API"作为永远不会被打破的黄金法则。

以前的答案之上,另一个想法是对继承DefaultRulesManager的类执行单元测试。

您必须通过使rules成员protected来稍微更改DefaultRulesManager类。继承的类可以命名为 DefaultRulesManagerTestable 并提供公共只读属性RulesCount该属性将返回 rules.Count

最新更新