TDD - 测试一种方法是否调用另一种方法

时间:2014-10-11 19:11:55

标签: unit-testing tdd

如果方法A的单个角色是调用方法B,那么当我调用方法A时,是否应该编写一个验证方法B的测试?或者这是浪费?

编辑:我正在编辑添加一些上下文。这是我的班级:

module PaidGigs
  class UserValue
    def initialize(user)
      @user = user
    end

    def default_bid(multiplier = 3.5)
      PaidGigs::UserValue.cpm_value(@user.instagram_follower_count, multiplier)
    end

    def bid_value_including_markup(user_bid, multiplier = 3)
      user_bid + PaidGigs::UserValue.cpm_value(@user.instagram_follower_count, multiplier, 0)
    end

    def self.cpm_value(base_count, multiplier, rounder = -1)
      ((base_count.to_f / 1000) * multiplier).round(rounder)
    end
  end
end

我应该编写一个验证'#default_bid'电话' .cpm_value'有适当的论据?这是浪费时间,还是有价值?

3 个答案:

答案 0 :(得分:1)

不要测试方法中的一个方法是否调用另一个方法。这将导致更脆弱的测试,并创建一个障碍(虽然很小)重构。你的测试不应该关心产生结果的内部结构,只关心它是正确的。

如果方法委托给另一个类,答案会改变 - 那么你绝对需要在一个单元测试中测试委托通过模拟委托来发生核心。

在类中调用其他人的方法有价值:方法的名称传达了方法的目的(如果它的名字很好),这对你班级的人类读者有益。名称齐全的方法(以及其他所有方法)功能非常强大,并且在很大程度上未被充分利用。类中的低级方法的名称可以在类中创建迷你DSL(领域特定语言),帮助读者快速了解高级方法正在做什么,而无需花时间深入细节。 / p>

答案 1 :(得分:0)

您所询问的是明确测试您的对象所做的一切,或者您想隐式测试它是否有意义。

这主要是一个意见问题。

就个人而言,我认为编写该测试没有任何价值,因为最终你应该编写一个测试来模拟方法的返回值并验证该函数,你的测试实际上以这种方式改变了模拟值。这样你隐式地测试你正在调用函数 - 如果你没有使用该方法来获得最终结果,那么该值就不会与你的预期结果一致。

编辑:更具可读性的代码示例:

Calculator.cs

public class Calculator {
    private IAddingService _addingService;
    public Calculator(IAddingService addingService) {
        _addingService = addingService;
    }
    public AddNumbers(int valueOne, int valueTwo) {
        return _addingService(valueOne, valueTwo);
    }
}

CalculatorTests.cs

public class CalculatorTests {
    public void test_adding_numbers() {
        var addingService = new Mock<IAddingService>()
        addingService.Setup(service => service.Add(1,2)).Returns(2);
        var calculator = new Calculator(addingService.Object);

        var result = calculator.Add(1,2);

        Assert.That(result, Is.EqualTo(2));
    }
}

在这个例子中,我已经暗示测试添加服务是我们添加内容的方式,因为没有允许计算器自行确定的动作。

答案 2 :(得分:-1)

我不明白你为什么不测试它。它很容易做到并且部分阻止了这种方法的进一步重构以破坏某些东西。