c# - 没有依赖关系的类的单元测试
问题描述
想象一下我有以下课程:
public class MyWeirdCollection
{
private IList<string> _myTrueList;
private IList<string> _myFalseList;
public MyCollection()
{
_myTrueList = new List<string>();
_myFalseList = new List<string>();
}
public void Add(string item, bool listType)
{
if (listType)
{
_myTrueList.Add(item);
}
else
{
_myFalseList.Add(item);
}
}
public IList<string> Get(bool listType)
{
return listType ? _myTrueList : myFalseList;
}
}
我将如何对Get
和Add
方法进行单元测试?我怀疑两种可能的解决方案:
- 使 2 个列表受保护而不是私有,因此我可以创建一个继承
TestableWeirdCollectionClass
,将列表的内容公开给测试 - 让课堂保持原样
Add
并Get
一起测试吗?即调用Add
添加一些元素,然后Get
查看是否返回正确的值。
我倾向于选择没有。2,但想多提点意见。谢谢。
解决方案
绝对选择选项 2。我能想象到的几乎所有测试都必须一起Add
进行Get
。
在测试时,您最终是在测试公共接口,而不是内部状态。测试代码的整个想法是你给它项目,然后你用适当的密钥把它们拿回来。在您的特定情况下,它使用私有列表来保存项目,但情况可能并非如此(您可能将它们存储到数据库或文件中,依赖于另一个类或其他东西)。这最终是一个实现细节,重要的是它Add
总是Get
一起玩,因此你应该这样做。
推荐阅读
- dataframe - Databricks 笔记本卡住了
- c# - 创建文件并让客户端通过 Web 浏览器即时下载
- python - 如何使用Python和词云生成高分辨率图片
- android - 找不到附近的地方
- reactjs - iOS 和 Android 是否支持带有 react native 的动画 GIF 图像?
- scikit-learn - sklearn.linear_model.Lasso中参数“选择”的作用是什么
- ios - 如何将 tableview 单元格附件应用于 tableview 记录
- https - 使用 GOST 2012 (ГОСТ Р 34.10-2012) 和 Python 2.7.15+ 的 https 连接:
- c# - 指定的演员在 Acumatica ERP 系统的新主屏幕中无效
- c++ - C++ 添加检查以避免读取两个参数