我正在尝试在我的代码中为一个小的更改请求应用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()”作为公共方法暴露给单元测试吗? 2.我是否应该为整个例程“main()”添加单元测试?
答案 0 :(得分:1)
这里有几种可能的方法。有关更广泛的讨论,您应该查看Michael Feather的“有效使用遗留代码”一书。
您可以轻松地将该方法设为公开,是的。缺点是您的类的公共接口增长,您可能不希望在其接口上公开此特定方法。决定因素通常是该方法是否有意义作为类的责任,即使它在生产中的唯一用途是在类中。如果确实如此,那么通过公开它就会失去任何东西,并且你在可测试性方面获益。
如果没有,那么你最好的办法是将方法提取到一个新的类中,该方法作为API成员有意义。然后,您可以独立于其使用的类来测试新类的功能。这样做的好处是新类中的逻辑可以更容易地进行测试,旧类可以使用某种模拟或伪注入,为您提供一个可能有用的测试接口,用于控制旧类测试中的行为。
提取到一个新类的缺点是,正如你所建议的那样,你会发现新类对旧类中的事情发生了某种时间依赖 - 即你最终在方法调用之间紧密耦合关于新类的旧类和方法。然而,实际上,存在设计缺陷并且新的类结构仅仅突出了缺陷。然而,你所获得的是新的类结构更容易测试,因此,更容易重构为更好的设计没有表现出这种问题。
tl; dr - 无论是在这个类还是在另一个类上,你都应该将这个方法公之于众。
答案 1 :(得分:0)
如果可以的话 - 更好地为newlogicX
方法编写测试。在这种情况下,如果你错过了测试中的某些内容 - 稍后处理它会更容易。
答案 2 :(得分:0)
如果这是您的结构,那么将其公之于众。鉴于该代码的结构是公共还是私有,这有什么区别?