在被测方法中使用的同一类中分离方法以允许模拟

时间:2017-07-19 08:24:35

标签: c# unit-testing mocking

我有一个很大的方法,我将它分成几个方法并将它们放在同一个类中。

示例:

public void Method(int param)
{
    var result = this.DoSomething(param);

    this.DoSomethingElse(result);
}

但是现在我无法测试这个方法,因为我无法模拟其中的方法,因为它们在被测试的类中。

较小的方法在同一个类中重用,但不在它之外。将它们放在不同的类中并将它们作为依赖项提供给我是一个好主意,以便我可以嘲笑它们吗?

或者该方法本身不值得测试,仅测试较小的方法就足够了吗?

2 个答案:

答案 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();