我正在嘗試創建類似於Rails assert_difference
的minitest斷言,但它檢查的不僅僅是數字差異。訪問Ruby中方法調用的塊範圍內的變量
這是我目前的執行:
Minitest::Assertions.module_eval do
def assert_changed(expression, &block)
unless expression.respond_to?(:call)
expression = lambda{ eval(expression, block.binding) }
end
old = expression.call
block.call
refute_equal old, expression.call
end
end
在我的測試套件
現在我做叫它如下:
# this is working
username = 'Jim'
assert_changed lambda{ username } do
username = 'Bob'
end
# this is not working
username = 'Jim'
assert_changed 'username' do
username = 'Bob'
end
第一次調用assert_changed
使用Lambda(或PROC)工作得很好。使用帶變量名稱的字符串的第二次調用不起作用。
當它碰上這條線:expression = lambda{ eval(expression, block.binding) }
我不斷收到錯誤TypeError: no implicit conversion of Proc into String
。有人可以向我解釋如何讓這個工作?
注意:我從Rails的assert_difference
方法中得到了eval(expression, block.binding)
的想法。
雖然我沒有看到你在你的問題中這樣做,但確實看起來像你試圖評估一個被捕獲的塊時得到的錯誤。 –
我想這是因爲你重新定義了變量*表達式*,然後在lambda中使用 –