如何将单元测试用例应用于一个大方法或例程的一部分?

How to apply Unit Test Case on one section of a one big method or routine?

我正在尝试将 TDD 应用于我的代码中的一个小更改请求。因为它是一个现有代码,周围绝对没有单元测试用例。我需要以下场景的帮助。

考虑示例(C# 代码示例):

private void main()
{
//some existing code logic
existinglogicA();
existinglogicB<some_inlinecode>;
existinglogicC<some_inlinecode>;

//Say, I am going to add new code logic here to follow the upward code workflow
newlogicX();

existinglogicD<some_inlinecode>;
existinglogicE();
}

问题: 1. 我应该将 "newlogicX()" 作为 public 方法公开给单元测试吗? 2. 是不是要麻烦给整个例程加上单元测试"main()"?

如果可以 - 最好只为 newlogicX 方法编写测试。在那种情况下,如果您在测试中遗漏了一些东西 - 稍后处理它会更容易。

如果那是你的结构,那就把它变成 public。鉴于该代码的结构,它是 public 还是私有有什么区别?

这里有几种可能的方法。要进行更广泛的讨论,您应该查看 Michael Feather 的书 Working Effectively With Legacy Code。

你可以很容易地制作方法public,是的。缺点是 class 的 public 接口增长,您可能不想在其接口上公开此特定方法。决定因素通常是该方法作为 class 的责任是否有意义,即使它在生产中的唯一用途是在 class 中。如果确实如此,那么通过 public 你不会有任何损失,而且你会在可测试性方面有所收获。

如果没有,那么最好的办法是将该方法提取到一个新的 class,其中该方法作为 API 成员确实有意义。然后,您可以测试新 class 的功能,与使用它的 class 隔离开来。这里的好处是新的 class 中的逻辑可以更容易地被测试,旧的 class 可以注入某种模拟或伪造,为您提供一个潜在有用的测试接缝来控制测试中的行为旧 class.

提取到新 class 的缺点是,正如您所建议的,您会发现新 class 对旧 [=] 中发生的事情有某种时间依赖性23=] - 也就是说,旧 class 上的方法调用与新 class 上的方法调用之间存在紧密耦合。然而,实际上,设计缺陷是存在的,新的 class 结构只是突出了这个缺陷。但是,您获得的是新的 class 结构更易于测试,因此更容易重构为 不具备的更好设计这种问题。

tl;dr - 不管怎样,你都应该在这个 class 或另一个

上制作方法 public