我有一个很大的方法,我将它分成几个方法并将它们放在同一个类中。
示例:
public void Method(int param)
{
var result = this.DoSomething(param);
this.DoSomethingElse(result);
}
但是现在我无法测试这个方法,因为我无法模拟其中的方法,因为它们在被测试的类中。
较小的方法在同一个类中重用,但不在它之外。将它们放在不同的类中并将它们作为依赖项提供给我是一个好主意,以便我可以嘲笑它们吗?
或者该方法本身不值得测试,仅测试较小的方法就足够了吗?
答案 0 :(得分:1)
我有一个很大的方法,我已经拆分成几种方法并放入 他们在同一个班级。
它称为重构(Extract Method) - 您正在改变实现而不改变行为。这就是为什么你不应该测试实现细节的主要原因。当类的行为没有改变时,你的测试不应该失败。这将允许您轻松地在类中进行大量小型重构 - 更改算法,拆分方法,更改内部使用的数据类型。而你的测试而不是失败将帮助你看到行为仍然正确实现。
E.g。如果你正在测试披萨店,那么你不关心他们的厨房有多大,在那个厨房里工作,以及他们使用什么型号的烤箱。您只对比萨饼店的行为感兴趣 - CookPepperoni()
应该返回所需质量的正确比萨饼。
将它们放在不同的类中是否是个好主意
嗯,技术上也称为重构 - Extract Class。但这是Martin Fowler对refactoring的定义:
重构是一种重组现有的规范技术 代码体,改变其内部结构而不改变它 外在行为。
所以,这是一个带有一点注释的重构 - 系统的行为不会改变,但是被测试的类的行为将会改变 - 它现在应该与外部依赖项交互。和比萨店一样 - 如果你要介绍对箱子工厂的依赖,那么比萨店的责任将涉及从工厂取箱子。这应该用模拟测试。
这种重构会打破你的考验。反之亦然 - 如果您正在练习TDD,那么您应该更改测试以检查新的预期行为。然后在测试失败后,你应该提取类并再次使测试变为绿色。
答案 1 :(得分:1)
常见的方法是创建一个不同的类来定义这些较小的方法。然后在您的主类中创建一个这个不同类的实例来调用它的方法。例如,这个不同的类称为ClassSmallMethods
(你应该选择更合适的东西)。然后在您的主类中创建另一个类的实例:
ClassSmallMethods ClassInstance = new ClassSmallMethods();
让我们假设您的班级public string ReturnString()
中有一个名为ClassSmallMethods
的方法会返回string
。现在,您可以调用此方法,并为exmaple获取方法返回的值。 (或做任何你想做的方法):
string randomString;
randomString = ClassInstance.ReturnString();