【发布时间】:2011-07-19 19:52:39
【问题描述】:
在阅读了 blog post 提到为了方便测试而公开一个公共 getter 似乎是错误的之后,我找不到任何更好实践的具体示例。
假设我们有这个简单的例子:
public class ProductNameList
{
private IList<string> _products;
public void AddProductName(string productName)
{
_products.Add(productName);
}
}
假设出于面向对象设计的原因,我没有必要公开公开产品列表。那么我如何测试 AddProductName() 是否完成了它的工作? (也许它添加了两次产品,或者根本没有。)
一种解决方案是公开 _products 的只读版本,我可以在其中测试它是否只有一个产品名称——我传递给 AddProductName() 的那个。
我之前提到的博客文章说它更多的是关于交互(即是否添加了产品名称)而不是状态。但是,state 正是我正在检查的内容。我已经知道 AddProductName() 已被调用——我想在该方法完成工作后测试对象的状态是否正确。
免责声明:虽然这个问题类似于 Balancing Design Principles: Unit Testing,(1) 语言不同(C# 而不是 Java),(2) 这个问题有示例代码,以及 (3) 我觉得这个问题没有得到充分的回答(即,代码将有助于演示概念)。
【问题讨论】:
-
我认为让这件事变得更棘手的是
AddProductName()的行为是它改变了ProductNameList的状态。跨度>
标签: c# unit-testing