c# - 为提取的方法添加单元测试

标签 c# unit-testing tdd

<分区>

假设您正在使用 TDD 开发产品。您逐渐添加测试并最终得到一个大方法。现在是重构的时候了,因此您将方法分成更小的方法。例如;

// Before refactoring.
public void SomeMethod()
{
    // ...
    int sum = numbers.Sum();
    // ...
}

// After refactoring.
public void SomeMethod()
{
    // ...
    int sum = GetSumOfNumbers(numbers);
    // ...
}

private GetSumOfNumbers(int[] numbers)
{
    return numbers.Sum();
}

在这一步之后,您是否应该为 GetSumOfNumbers 方法编写测试?我认为当我们测试 SomeMethod 时,我们已经测试了 GetSumOfNumbers。但与此同时,可能还有其他方法使用 GetSumOfNumbers,即使它适用于 SomeMethod,但可能不适用于其他方法。这将帮助我们更快地找到问题(因为测试会给出更具体的错误)。但与此同时,这可能没有用,而且增加了冗长。

你怎么看?在示例中,GetSumOfNumbers 方法是私有(private)的,因此如果您认为不应该仅仅因为它是私有(private)的就对其进行测试,那么如果它是公共(public)的,是否应该对其进行测试?

最佳答案

您应该测试类的公共(public) API。不要测试私有(private)方法。这样做会创建一个与您的类紧密耦合的测试套件。类中的每个内部更改都会破坏测试套件中的一些测试。

如果您认为您应该测试一个特定的私有(private)方法 - 可能是因为它执行一些复杂或复杂的逻辑 - 那是一种气味告诉你可能是时候将该方法移到一个新类中了。

关于c# - 为提取的方法添加单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726392/

相关文章:

c# - 这个foreach中间有个cast,能翻译成linq吗?

c# - 基于运行时输入的依赖注入(inject)

unit-testing - 我是否应该使用不应在函数中传递的数据(无效输入)进行单元测试?

javascript - 如何对仅更改内部状态的函数进行单元测试

python - 如何在 Django 单元测试中输出完整差异?

ruby-on-rails - 如何在我的 rspec 测试中设置一个变量,以便 Controller 可以使用它进行查询?

c# - 桌面应用程序中的数据可视化

c# - 在委托(delegate)声明中有 body 是什么意思?

java - 单元测试无效带有随后续操作改变状态的依赖项的方法

java - BDD 方式的 JUnit 测试应该如何集中