C# 如果一个方法只更改私有成员并返回它,如何进行单元测试
请看一下我下面的场景C# 如果一个方法只更改私有成员并返回它,如何进行单元测试,c#,.net,unit-testing,C#,.net,Unit Testing,请看一下我下面的场景 public class Test { private Tech tech = null; ... public Tech GetExpectedTech(string condition) { ... return tech; } } 我不确定使用这种方法进行单元测试的最佳方法。也许我可以使用反射,但我认为这不是一个明智的方法。有人有想法吗?想想你真正感兴趣的是什么。对于GetExpected
public class Test
{
private Tech tech = null;
...
public Tech GetExpectedTech(string condition)
{
...
return tech;
}
}
我不确定使用这种方法进行单元测试的最佳方法。也许我可以使用反射,但我认为这不是一个明智的方法。有人有想法吗?想想你真正感兴趣的是什么。对于
GetExpectedTech
方法,您传入一个字符串并返回一个Tech
。可能传入的字符串与返回的Tech
之间存在某种联系。这就是您应该测试的内容(可能不是null,包含预期值等)
如果该方法的一个副作用是Tech
存储在类的一个字段中,那么您这样做一定是有原因的(否则您不应该这样做)。目前,您发布的代码中没有任何原因,但是最可能的原因似乎是类中会有其他方法使用该Tech
或返回它。此时,您可以将这两个方法链接起来,以在这两个方法之间创建关系。如果方法之间的关系是您要测试的内容的一部分,那么在SUT上调用多个方法没有什么错,因此您可以执行以下操作:
var expectedTech = sut.GetExpectedTech(someString);
var otherTech = sut.DoSomethingElse(someOtherParams);
Assert.AreEqual(expectedTech, otherTech);
如果需要测试与Tech
的交互以获得其他方法,那么您可能需要查看创建模式,以便能够将模拟注入SUT,但在不知道您的类还做什么的情况下,很难说这是否必要
正如您所说的,您可以使用反射来访问成员,但是这样做正确的场景数量相对较少,因此如果您需要这样做,这可能表明您的类需要重构。我建议为纯粹主义者阅读单元测试测试行为,而不是代码/实现。因此,无论您在方法中做什么,以及如何做,在单元测试中都不重要。这是该方法的作用和行为取决于您的期望。所以你不应该关心私人因素。如果内部实现发生了变化,但方法仍然像以前一样运行,那么您的测试不应该中断。谢谢您的友好回复。实际上,这是一个请求生成器类,参数是requestType枚举,该类只实现一个请求生成器接口。这个类中没有其他方法。@AllenLi-AI3听起来你的测试可能是,如果你调用这个方法两次,你会得到相同的
Tech
实例。否则,我不知道为什么要更新成员变量。这不是为了更新成员变量,而是基于requestType参数创建一个请求并返回它。@AllenLi-AI3那么为什么要将它存储在类中而不是简单地返回它?我要测试的是,该方法是否返回了正确的请求,所以我想我应该检查返回实例中的每个属性。是否将其存储在类中不是问题,在方法中创建实例也可以。