Ruby 验证来自屈服块的响应
假设我正在测试以下类:Ruby 验证来自屈服块的响应,ruby,rspec,Ruby,Rspec,假设我正在测试以下类: 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 e
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 }
<>编辑:我忽略了水果类的细节,它应该是无关的。 如果你不得不尝试在你测试的方法中间找到结果,那通常是一个很好的迹象,你需要重构。 下面是一个示例:向分支添加一个方法,然后测试分支类(假设它是您控制的类) 这更容易测试,因为inject返回散列。您可以为分支类编写单元测试并隔离该方法。然后在
Processor#process
方法中,用调用branch.unique(
替换inject块
如果您无法控制分支,只需将块提取到处理器上的另一个方法
类:
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
然而,您可能会看到它看起来并没有那么好,
处理器
类在不同的抽象级别上工作。但是这两个都是更容易的单元测试。 < P>如果你不得不尝试在测试方法的中间找到结果,通常是一个很好的迹象,你需要重构。
下面是一个示例:向分支添加一个方法,然后测试分支类(假设它是您控制的类)
这更容易测试,因为inject返回散列。您可以为分支类编写单元测试并隔离该方法。然后在Processor#process
方法中,用调用branch.unique(
替换inject块
如果您无法控制分支,只需将块提取到处理器上的另一个方法
类:
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
然而,您可能会看到它看起来并没有那么好,
处理器
类在不同的抽象级别上工作。但这两个都更容易进行单元测试。谢谢!我倾向于那个解决方案,不确定它是否正确,因为我喜欢测试整个类,而不是内部方法。我不确定,在我的情况下,第一个解决方案是否有意义,所以我不得不选择第二个。谢谢!我倾向于那个解决方案,不确定它是否正确,因为我喜欢测试整个类,而不是内部方法。我不确定,在我的情况下,第一个解决方案是否有意义,所以我不得不选择第二个。