C# 单元测试.验证列表计数
本文关键字:列表 验证 单元测试 | 更新日期: 2023-09-27 18:31:35
我想有一个测试用例,我可以验证随着新 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
。