假设我正在测试以下类:
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类的细节,它应该是无关紧要的。
答案 0 :(得分: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
这更容易测试,因为inject返回哈希值。您可以为分支类编写单元测试并隔离该方法。然后在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
类正在不同的抽象层次上工作。但这两个都更容易进行单元测试。