【问题标题】:Unit Test for a Method that Changes the State of a private Field更改私有字段状态的方法的单元测试
【发布时间】:2011-08-20 00:32:29
【问题描述】:

所以,我有以下问题(使用 C#):

我在一个类中有两个私有字段,一个保存字段的原始状态,一个保存更新后的状态。

我现在想写一个基本上取原始状态的方法,将其复制到更新状态并更改其部分内容。

到目前为止,我已经将其实现为一个 void 方法,它只是更改字段的状态(如果需要)。这些字段稍后将被其他方法使用。

我认为我的实现不会有任何问题,但我正在尝试为此方法(使用 MSTest)编写单元测试,但看不到如何正确测试它。

我真正需要测试的是,在给定输入参数的情况下,字段的内容是否与其原始状态相比发生了变化。由于这两个字段都是私有的,我既不能访问原始状态来为单元测试设置值,也不能访问这些字段以用于任何断言的任何比较。

最简单的方法是使用公共属性公开所有这些字段,但除了单元测试之外,我真的没有使用公共属性。另一种方法是重写方法以返回更新后的状态,但这仍然无法帮助我将原始状态设置为测试所需的状态。

关于如何解决这个问题的任何想法或最佳实践?

【问题讨论】:

    标签: c# unit-testing mstest


    【解决方案1】:

    使用PrivateObject.GetField() 检索该字段的最终状态。 (privateObject members)

    这比仅仅为了使其可测试而修改 API 更好。

    【讨论】:

    • 我想这就是我想要的。我实际上更改了方法以获取原始状态并返回更新后的状态,这使得它可以自行测试。我不确定我是否对该解决方案感到满意,因此我可能会返回到以前的迭代之一并更新测试以改用 PrivateObject。无论如何,这对于将来的测试非常有用。
    【解决方案2】:

    如果字段被正确复制,它会产生什么可见变化?大概它会以某种方式影响对象的行为......所以这是理想的测试方法。

    有时为了可测试性(结合InternalsVisibleTo)添加内部辅助方法是值得的,但理想情况下,测试可见行为/状态的更改是一种不那么脆弱的方法。

    【讨论】:

    • 直到很久以后,当另一种方法使用这些字段写出一个 xml 文件时,可见的变化才明显。基本上有一些方法可以读取原始 xml,对特定节点进行更改并写出更新的 xml。我设法构建了它,以便我可以自己测试所有方法,但是这个方法介于两者之间,并且在当前状态下需要检索原始状态的方法和写出更改以进行更改的方法可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2014-08-10
    • 2015-04-12
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多