【问题标题】:Test ruby yield method for block execution测试块执行的 ruby​​ yield 方法
【发布时间】:2018-01-26 09:06:03
【问题描述】:

每当我将一个块传递给 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 方法的块被执行时才运行的语句

【问题讨论】:

  • 在这种情况下,您已经知道调用了该块,否则会出现 LocalJumpError(“No Block Given”)。如果您使用yield(item) if block_given?,那将是另一回事。
  • @maxpleaner yield 如果list 为空,则不会被调用。
  • 或许你可以使用these Rspec tests

标签: ruby yield


【解决方案1】:

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

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,而不是最终是否调用了某个块。如果块有你关心的副作用,你应该直接测试那个副作用,而不是基于块执行来假设它。

【讨论】:

  • 啊,是的,这正是我想要的。谢谢!
猜你喜欢
  • 2011-03-14
  • 2018-01-10
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多