1

假设我正在测试以下类:

class Processor
  def initialize(tree)
    @tree = tree
  end

  def process(entity)
    @tree.each_branch do |branch|
      branch.inject({}) do |result, fruit|
        result[fruit.name] = fruit.type == entity.type
      end
    end
  end
end

我想注入一个存根树,在我的规范中我会:

describe Processor do
  let(:tree) { double("tree") }
  let(:apple) { Fruit.new("apple") }
  let(:processor) { Processor.new(tree) }

  let(:fruit1) { Fruit.new("orange") }
  let(:fruit2) { Fruit.new("apple") }

  it "should process a fruit"
    tree.stub(:each_branch).and_yield([fruit1, fruit2])
    Processor.process(apple)
  end
end

我希望在块中创建以下哈希。如何验证它是否正确创建并返回给块的调用者?

{ "orange" => false, "apple" => true }

编辑:我省略了 Fruit 类的细节,它应该是无关紧要的。

4

1 回答 1

1

如果您不得不尝试在测试方法的中间某处捕获结果,这通常是您需要重构的好兆头。

这是一个示例:向分支添加一个方法,然后测试分支类(假设它是您控制的类)。

class Branch
  def unique_fruits
    inject({}) do |result, fruit|
      result[fruit.name] = fruit.type == entity.type
    end
  end
end

class Processor
  # snip ...
  def process(entity)
    @tree.each_branch do |branch|
      branch.unique_fruits
    end
  end
end

这更容易测试,因为注入返回哈希。您可以为分支类编写单元测试并隔离该方法。然后在Processor#process方法中,您将注入块替换为对branch.unique_fruits.

如果您无法控制分支,只需将块提取到Processor类上的另一个方法:

class Processor
  # snip...

  def process(entity)
    @tree.each_branch do |branch|
      unique_fruits_on_branch(branch)
    end
  end

  def unique_fruits_on_branch(branch)
    branch.inject({}) do |result, fruit|
      result[fruit.name] = fruit.type == entity.type
    end
  end
end

但是,您可能会看到它看起来不太好 -Processor该类在不同的抽象级别上工作。但这两者都更容易进行单元测试。

于 2013-03-26T14:47:58.267 回答