我有下面的公共void方法:
public void Reset()
{
// Get updates
// update logic for each value in _dict
}
而_dict是类的私有成员:
private readonly dictionary<string, string> _dict;
如何对Reset()方法的更新逻辑执行单元测试?重置后如何验证_dict中的值是否正确?我不想为_dict设置公共getter来公开它。
我用的是xunit和c#
我很粗鲁,所以我认为您应该尝试TDD,因为它有效地防止了这种不可测试的设计。
在你的特殊情况下,我们不了解全部情况。Reset()
的效果应该可以从类外部观察到,否则就不需要该方法。
现在我不得不猜测调用Reset()
可能有太多可观察到的效果,所以测试它们将是一个痛苦的过程。我建议将你的职业分成两类,一类具有"功能性",另一类具有"重置"能力。然后,在可重置类上调用Reset()
的所有效果将是可观察的,并且您可以测试它们,并且没有其他私有成员在Reset()
和您也拥有的任何功能之间传递信息的风险。
更新:永远按照Mark Seemann告诉你的去做,因为他永远是对的:)
调用Reset()
应该有一些可观察到的效果,您可以使用类的公共接口进行测试。私有字段和方法是实现细节,你不应该直接测试它们。
编写单元测试的主要目标之一是能够在保持可见行为不变的情况下修改实现。如果测试私有字段或方法,重构将破坏测试。过了一段时间,你要么完全停止重构,要么就会有一堆红色的测试。
所以问问你自己为什么要在你的类中添加public Reset()
方法?为什么类的客户端调用这个方法?
例如,如果您使用私有字典来实现某种缓存,并且Reset()
方法清除了缓存,那么模拟您的存储库并测试在调用Reset()
之后是否获得了新数据。
如果你不能找到一种方法来测试使用你的类的公共接口调用它的效果,那么你不需要这个方法。删除它。更少的代码=更容易维护
也许您可以使用模式Test specific Subclass,扩展类并公开私有成员或创建公开结果的公共方法。
更多信息:http://xunitpatterns.com/Test-Specific%20Subclass.html