Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新私有成员的公共void方法的单元测试_C#_Unit Testing_Xunit - Fatal编程技术网

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。