【问题标题】:If a function depends on another function, how do you emplace that inner-function with mock data for unit testing?如果一个函数依赖于另一个函数,你如何用模拟数据替换该内部函数以进行单元测试?
【发布时间】:2019-06-27 20:12:51
【问题描述】:

所以我有这样的事情:

class MyClass {
    private myVar;

    public MyClass(someValue) {
        // Performs some operation to determine myVar
    }

    public double calculateThing() {
        // Returns some arithmetic operation on myVar
    }

    public double calculateOtherThing() {
        newVar = calculateThing();
        // Returns some arithmetic operation on newVar
    }
}

calculateThingUnitTest() {
    MyClass class = new MyClass(someValue);

    Assert::AreEqual(someConstant, class.CalculateThing());
}

calculateOtherThingUnitTest() {
    MyClass class = new MyClass(someValue);

    Assert::AreEqual(someOtherConstant, class.CalculateOtherThing());
}

很明显calculateThingUnitTest 是一个合适的单元测试,因为它初始化一个类,在构造函数中给它一些字面定义的独立值,并且它所做的断言基于@ 987654323@,所以它测试应用程序的一个“单元”。

但是,calculateOtherThingUnitTest 调用calculateOtherThing,然后调用calculateThing 以确定结果是否正确。因此,如果 calculateThing 最终失败,calculateOtherThing 也会失败。

为了防止这种情况发生,您需要放置一些模拟值来代替calculateThing,您可以通过将新成员变量插入MyClass 并将calculateThing 加载到该成员变量中来实现此目的。然后在调用calculateOtherThing 之前,您可以在该成员变量中插入一个文字值,这样您就可以进行适当的单元测试了。

然而,添加一个新成员变量并将其公开给公众似乎非常过分。有没有更好的方法来实现这一点?

注意:虽然我使用的是伪代码,但我正在使用 C# 和 Visual Studio .Net 单元测试项目。

【问题讨论】:

  • 嗯,这并不是一个真正的问题,更重要的是,这似乎是单元测试领域的“坏习惯”(我对此很陌生),所以我很好奇您将实施什么策略以使其成为“良好实践”。同样在我的具体情况下,将方法保持为非静态将有利于整体设计。我想我在问什么是实现单元测试的“正确”方法,假设该方法是非静态的。
  • 隔离那个目标函数的困难应该是这个函数有太多职责的指标,这是违反(SRP - 单一职责原则)的,因为它与 SOLID 代码有关。
  • 对糟糕的代码进行单元测试并不能改变代码设计糟糕的事实。然而,它应该有助于识别糟糕的代码,以便对其进行相应的重构。
  • 阅读 SOLID 原则。你可能误解了我的解释。

标签: c# visual-studio unit-testing testing


【解决方案1】:

您正在寻找的是部分模拟。您需要模拟未测试的方法。并且您需要将测试方法保留为默认实现。因此,当您调用被测方法时,所有其他方法都不会被调用,因为它们是被模拟的。

所以你可以模拟calculateThing,然后直接测试其他方法。

Stackoverflow link

【讨论】:

  • 这正是我想要的!谢谢!
  • 实际上我自己想出了一个解决方案:创建一个覆盖内部函数返回值的扩展类。这正是它所要达到的目的(但以一种更简洁的方式)。
  • @ShaneDuffy 欢迎您。你的方法也有效。虽然当我们有好的工具可供我们使用时,我会对为了测试而过多地改变架构持怀疑态度。
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多