我正在尝试创建类似于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中使用 –