更新私人成员的公共void方法的单元测试

时间:2015-10-05 04:54:25

标签: c# unit-testing xunit

我有以下公共无效方法:

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#。

3 个答案:

答案 0 :(得分:5)

我很粗鲁,所以我认为你应该尝试TDD,因为它有效地防止了这样的不可测试的设计。

在您的特定情况下,我们没有完整的故事。 Reset()的效果应该从课外观察,否则你不需要这种方法。

现在我不得不猜测调用Reset()可能有太多可观察到的影响,所以测试它们都会很痛苦。我建议将你的课程分为两类,一类是“功能”,一类是“重置”。然后,对可复制类调用Reset()的所有效果都是可观察的,您可以测试它们,并且其他私有成员不会在Reset()和您也拥有的任何功能之间传递信息。

更新:始终按照Mark Seemann告诉你的那样做,因为他是不变的:)

答案 1 :(得分:1)

调用Reset()应该有一些可观察到的效果,你可以使用你的类的公共接口进行测试。私有字段和方法是实现细节,您不应该直接测试它们。

编写单元测试的主要目标之一是能够在保持可见行为不变的情况下修改实现。如果您测试私有字段或方法,重构将破坏您的测试。过了一段时间,你将要么停止重构,要么你将进行一系列的红色测试。

那么问问自己为什么要在课堂上添加public Reset()方法?为什么班上的客户会调用此方法?

例如,如果您使用私有字典来实现某种缓存,并且Reset()方法清除缓存,请模拟您的存储库并测试在调用Reset()后是否获得新数据。

如果您无法使用班级的公共界面来测试调用它的效果,那么您就不需要这种方法。删除它。更少的代码=更容易维护。

答案 2 :(得分:0)

也许您可以使用模式Test Specificc Subclass,扩展类并公开私有成员或创建公开结果的公共方法。

更多信息:http://xunitpatterns.com/Test-Specific%20Subclass.html

希望这有帮助。