测试 ruby 块执行的 yield 方法

Test ruby yield method for block execution

每当我将块传递给 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 方法的块被执行时才向 运行 声明

您需要在块外初始化一个变量,然后在块内设置它,然后进行测试。

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

或者您可以将yield_method修改为return一个基于是否满足要执行的块的条件的值:

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

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