如何测试一个执行* lot *参数处理的方法?

时间:2015-11-02 19:50:05

标签: ruby unit-testing testing rspec

我在我的应用中定义了以下方法:

def self.analyze(params)
  processed_params = params.flat_map do |metric, value|
    Moods::Processors.processors[metric].map { |p| p.process(value) }
  end

  weighted_moods = processed_params.inject(Hash.new(0)) do |memo, pp|
    memo.merge(pp) { |_, left, right| left + right }
  end

  normalized_moods = Moods.pairs.each_with_object({}) do |(pos, neg), memo|
    normalized_weight = weighted_moods[pos] - weighted_moods[neg]
    if normalized_weight > 0.0
      memo[pos] = normalized_weight
    elsif normalized_weight < 0.0
      memo[neg] = normalized_weight.abs
    end
  end

  sorted_moods = normalized_moods.sort_by { |_, v| -v }.map(&:first)

  mood_combinations = sorted_moods.size.downto(1).flat_map do |i|
    sorted_moods.combination(i).to_a
  end
end

我主要担心的是:我该如何测试这种方法?我看到的唯一可接近的方式是计算一些通用场景,这些场景大致遍历代码中的每个案例/分支。但这不是彻底的测试。

另一个想法是在私有方法中分离每个代码片段并对其进行单元测试。但私人方法不应该被测试......

如果我想要一切彻底,我可能最终得到一些非常复杂的矩阵。

那么,这是测试这种方法的理想方法吗?

1 个答案:

答案 0 :(得分:1)

在测试这样的代码时,有时常规的单元测试并不足以执行所有必要的行为以确保其正常工作。

这里存在一些设计问题,这种方法做了很多工作,检查中间操作的结果是不切实际的。如果你可以将其中一些操作分解为可以单独测试的公共方法,那将有所帮助。

我通常如何处理这样的事情是在test/中创建一个目录,其中有几十个&#34;场景&#34;文件。像JSON或YAML这样的序列化格式用于定义数据结构,然后您有一个单元测试,可以旋转所有这些并验证它们是否正常工作。

以下是一个人的结构:

given:
  a: 1
  b: 2
expect:
  3

在哪里说你有一个非常简单的函数f(a,b),你想确保它的结果是a + b。您将要探索边缘情况,即行为发生变化的情况。