Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# 如果一个方法只更改私有成员并返回它,如何进行单元测试_C#_.net_Unit Testing - Fatal编程技术网

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那么为什么要将它存储在类中而不是简单地返回它?我要测试的是,该方法是否返回了正确的请求,所以我想我应该检查返回实例中的每个属性。是否将其存储在类中不是问题,在方法中创建实例也可以。