测试块执行的ruby yield方法

时间:2017-08-17 19:43:54

标签: ruby yield

每当我将块传递给Ruby中的yield方法时,我想知道块是否实际执行过。例如:

def yield_method(list)
  list.each do |item|
    yield item
  end
end

yield_method(ARGV) { |item|
  print item
}

print "executed"

我想要

print "executed"

语句仅在传递给yield方法的块执行时运行

1 个答案:

答案 0 :(得分:3)

您需要在块外部初始化变量,然后在块中设置它,然后测试它。

executed = false
yield_method(ARGV) do |item|
   executed = true
   # whatever else
end
print "executed" if executed

或者您可以修改yield_method以根据是否满足要执行的块的条件返回值:

def yield_method(list)
  list.each do |item|
    yield item
  end
  list.any?
end

executed = yield_method(ARGV) { ... }
print "executed" if executed

那就是说,需要知道块是否被执行对我来说闻起来很糟糕 - 我会让你的测试测试条件允许块执行(如第二种形式),并写下你的代码在语义上反映出来。例如:

def process_argv(list)
  list.each do |item|
    yield item
  end
  list.length
end

args_processed = process_argv(ARGV) { ... }
print "executed" if args_processed > 0

这反映出在这种情况下,您关心是否存在要处理的args,而不是是否某些块最终被调用。如果该块具有您关心的副作用,则应直接测试该副作用,而不是基于块执行来假设它。