【问题标题】:How to unit test if a method only changes a private member and returns it如果方法仅更改私有成员并返回它,如何进行单元测试
【发布时间】:2015-07-08 07:19:01
【问题描述】:

请看下面我的场景,

public class Test
{
    private Tech tech = null;

    ...

    public Tech GetExpectedTech(string condition)
    {
        ...

        return tech;
    }
}

我不确定对这种方法进行单元测试的最佳方法。也许我可以使用反射,但我认为这不是一种明智的方式。有人有想法吗?

【问题讨论】:

  • 我建议阅读this
  • 对于纯粹主义者,单元测试测试行为而不是代码/实现。因此,无论您在方法中做什么以及如何做,在单元测试中都不重要。这是该方法的作用和行为取决于您的期望。所以你不应该关心私有元素。如果内部实现发生了变化,但方法仍然像以前一样,你的测试不应该中断。

标签: c# .net unit-testing


【解决方案1】:

想想你真正对测试感兴趣的是什么。对于您的GetExpectedTech 方法,您传入一个字符串并返回一个Tech。大概在传入的字符串和返回的Tech 之间存在某种联系。这就是您应该测试的内容(可能不是 null,包含预期值等)。

如果该方法的副作用是Tech 存储在类的字段中,那么您必须这样做是有原因的(如果不是,您不应该这样做)。目前您发布的代码中没有任何原因,但最可能的原因似乎是类中将有其他方法使用该Tech 或返回它。此时,您可以将这两种方法链接起来,以在两种方法之间建立关系。如果方法之间的关系是您要测试的一部分,那么在您的 SUT 上调用多个方法没有任何问题,因此您可以这样做:

var expectedTech = sut.GetExpectedTech(someString);
var otherTech = sut.DoSomethingElse(someOtherParams);
Assert.AreEqual(expectedTech, otherTech);

如果您需要测试其他方法与 Tech 的交互,那么您可能需要查看创建模式,以便能够将 Mock 注入您的 SUT,但不知道您的类还有什么这是否必要很难说。

正如您所说,您可以使用反射或PrivateObject 访问成员,但是正确执行此操作的场景数量相对较少,因此如果您需要这样做,可能是表明你的类需要重构。

【讨论】:

  • 感谢您的热情回复。其实这是一个request builder类,参数是一个requestType枚举,这个类只实现了一个request builder接口。此类中没有其他方法。
  • @AllenLi-AI3 那么听起来你的测试可能是,如果你调用该方法两次,你会得到相同的 Tech 实例。否则,我不确定您为什么要更新成员变量。
  • 这不是更新成员变量,这是根据requestType参数创建一个请求并返回。
  • @AllenLi-AI3 那你为什么把它存储在类中而不是简单地返回呢?
  • 我想测试的是该方法是否返回了正确的请求,所以我认为我应该检查返回实例中的每个属性。类中存不存都不是问题,在方法中创建实例也可以。
猜你喜欢
  • 2016-01-01
  • 2011-10-10
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2018-08-01
  • 2022-11-30
相关资源
最近更新 更多