C# 更新私有成员的公共void方法的单元测试
我有以下公开作废方法:C# 更新私有成员的公共void方法的单元测试,c#,unit-testing,xunit,C#,Unit Testing,Xunit,我有以下公开作废方法: public void Reset() { // Get updates // update logic for each value in _dict } 虽然dict是班级的私人成员: private readonly dictionary<string, string> _dict; private readonly dictionary\u dict; 如何对Reset()方法的更新逻辑执行单元测试?重置后如何验证dict中的值
public void Reset()
{
// Get updates
// update logic for each value in _dict
}
虽然dict是班级的私人成员:
private readonly dictionary<string, string> _dict;
private readonly dictionary\u dict;
如何对Reset()方法的更新逻辑执行单元测试?重置后如何验证dict中的值是否正确?我不想为dict设置public getter来公开它
我使用的是xunit和C#。我很粗鲁,所以我认为你应该试试TDD,因为它可以有效地防止像这样不稳定的设计 在你的特殊情况下,我们不了解全部情况。
Reset()
的效果应该可以从类外观察到,否则不需要该方法
现在我不得不猜测调用Reset()
,可能会有太多可观察的效果,所以测试它们都会很痛苦。我建议将您的类分为两个类,一个具有“功能”,另一个具有“重置”功能。然后,调用可重置类上的Reset()
的所有影响都是可以观察到的,您可以对其进行测试,并且不会有其他私有成员在Reset()
和您拥有的任何功能之间传递信息的风险
更新:总是按照Mark Seemann告诉你的去做,因为他是绝对正确的:)我很粗鲁,所以我认为你应该试试TDD,因为它可以有效地防止像这样不稳定的设计 在你的特殊情况下,我们不了解全部情况。
Reset()
的效果应该可以从类外观察到,否则不需要该方法
现在我不得不猜测调用Reset()
,可能会有太多可观察的效果,所以测试它们都会很痛苦。我建议将您的类分为两个类,一个具有“功能”,另一个具有“重置”功能。然后,调用可重置类上的Reset()
的所有影响都是可以观察到的,您可以对其进行测试,并且不会有其他私有成员在Reset()
和您拥有的任何功能之间传递信息的风险
更新:始终按照Mark Seemann的指示去做,因为他是绝对正确的:)调用
Reset()
应该有一些可以观察到的效果,您可以使用类的公共接口来测试这些效果。私有字段和方法是实现细节,您不应该直接测试它们
编写单元测试的主要目标之一是能够修改实现,同时保持可见行为不变。如果您测试私有字段或方法,重构将破坏您的测试。一段时间后,要么停止重构,要么进行一系列红色测试
因此,问问自己为什么要在类中添加public Reset()
方法?为什么您的类的客户端会调用此方法
例如,如果您使用私有字典实现某种缓存,并且Reset()
方法清除缓存,则模拟存储库并测试调用Reset()
后是否获得新数据
如果找不到一种方法来测试使用类的公共接口调用它的效果,那么就不需要这个方法。删除它。更少的代码=更容易维护。调用
Reset()
应该有一些可以观察到的效果,您可以使用类的公共接口进行测试。私有字段和方法是实现细节,您不应该直接测试它们
编写单元测试的主要目标之一是能够修改实现,同时保持可见行为不变。如果您测试私有字段或方法,重构将破坏您的测试。一段时间后,要么停止重构,要么进行一系列红色测试
因此,问问自己为什么要在类中添加public Reset()
方法?为什么您的类的客户端会调用此方法
例如,如果您使用私有字典实现某种缓存,并且Reset()
方法清除缓存,则模拟存储库并测试调用Reset()
后是否获得新数据
如果找不到一种方法来测试使用类的公共接口调用它的效果,那么就不需要这个方法。删除它。更少的代码=更容易维护。也许您可以使用模式测试指定的子类,扩展类并公开私有成员,或者创建公开结果的公共方法 更多信息:
希望这有帮助。也许您可以使用模式测试指定的子类,扩展类并公开私有成员,或者创建公开结果的公共方法 更多信息: 希望这有帮助。通过公共API测试:相应地设计API。通过公共API测试:相应地设计API。