[英]Define a method within a block's scope, while still having access to the global scope in Ruby, without block arguments?
我想簡化一些測試。 具體來說,我想定義一個塊聲明方法,在該塊中,您可以訪問特殊的輔助方法,同時還可以訪問測試上下文。 像這樣:
def assert_metric(report, metric, &block)
def sum(value, *filters)
filters.each do |filter|
assert_equal value, report.sum(metric, filter)
end
end
instance_eval(&block)
end
assert_metric report, :select_count do
sum 1
sum 1, :bookmark, :like
sum 0, :vote
end
正確的方法是什么?
約束*:
sum
方法是在當前正在執行的測試的上下文中執行的(因此您可以執行assert_equal
並訪問所有實例變量。 sum
在該塊之外不可用 do |test_context|...
) 有任何想法嗎?
您似乎以為def sum
就像Python中的嵌套函數一樣工作。 沒有。 這將在測試類上定義一個方法。 無法僅在另一個方法中定義一個方法-方法屬於類或對象。 但是,您可以定義一個僅存在於其中的實現該方法的對象。
如果我正確理解了您的要求,則最接近的等效內容可能是:
require 'delegate'
def assert_metric(report, metric, &block)
ctx = SimpleDelegator.new(self)
ctx.singleton_class.class_eval do
define_method(:sum) do
filters.each {|filter| assert_equal value, report.sum(metric, filter)}
end
end
ctx.instance_eval(&block)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.