【问题标题】:Refactoring parameters and unit tests重构参数和单元测试
【发布时间】:2008-12-20 16:48:26
【问题描述】:

我有这个方法:

public bool CanExecute()

在 70 次提交后,我添加了一个额外的参数

public bool CanExecute(IStation target)

现在的问题是我有 7 个单元测试,涵盖了测试各种空值/属性组合的 CanExecute 方法。

添加这个简单的参数需要修复这 7 个单元测试。修复很简单,但是...

是否有最佳实践和/或模式来避免更新单元测试所需的这种手动重构?

假设我知道在不久的将来可能会添加一个额外的参数,我如何编写单元测试代码来解决这个问题?它只是矫枉过正还是有什么成语/模式/要遵循的东西?

编辑:我不能简单地添加重载,因为 IStation 依赖项不是可选的。我正在修复一个错误,其中需要一个 IStation 实例,但没有一个可用,所以它必须通过 CanExecute 提供......你看。

重构工具似乎是要走的路。谢谢!

【问题讨论】:

    标签: c# unit-testing parameters


    【解决方案1】:

    您不能在代码中保留这两种方法吗?除非 IStation 参数必须为非 null,否则您可以在不更改任何现有代码的情况下摆脱它。

    或者,如果参数有一个合理的默认值(同样,像 null!),resharper 可以很容易地处理这样的变化。要添加新参数,请右键单击函数名称并选择更改签名... 从这里您可以添加具有合理默认值的新参数。 RS 将更新所有调用,因此您不必这样做!

    【讨论】:

    • +1,resharper 就是这样做的,不需要手动重构。
    • +1,如果您想避免更改调用代码,请保留重载方法的好技巧
    • VS2005 几乎可以通过 Refactor > Promote Local Variable to Parameter 右键单击​​选项来实现。确保在同一行有一个带有赋值的局部变量。可能不如 RS,但它可以在紧要关头工作。
    【解决方案2】:

    如果您知道该方法可能会再次更改,我认为明智的做法是重载该方法并为重载的成员添加单元测试,而不是更改旧的单元测试。如果星星为你对齐,你甚至可能会发现重载的方法调用了原来的无参数方法,所以你只需要为新参数编写测试,而不是重复原来的七个测试。

    【讨论】:

    • 可以根据您测试的方法的(当前)实现细节做出假设吗?我的理解是,更改方法的内部实现细节(但不会更改方法的“接口”或行为保证)不应该需要更改单元测试。
    • 应该只对公共方法进行单元测试,但实现更改可能会导致方法的预期返回值发生更改,因此有时即使 API 保持不变,测试也必须更改相同的。所以,基本上是的,你正在测试你的方法的当前实现。
    【解决方案3】:

    您当然需要考虑是否在单元测试中复制了太多功能,但情况可能并非总是如此。

    相当多的现代 IDE(C# 的 resharper)支持“更改方法”重构,它允许您为新参数提供默认值。我发现掌握这种重构功能真的很值得。

    【讨论】:

      【解决方案4】:

      我会保留两者。重载方法并为新的重载方法添加单元测试,以涵盖您刚刚添加的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 2016-12-04
        相关资源
        最近更新 更多