【发布时间】:2020-01-06 12:31:17
【问题描述】:
在 Rspec 中,我想利用 super() 调用已定义的 let 块(如果存在)或设置新值(如果不存在),我想在 shared_example 组中使用它,但是我只是找不到如何做到这一点。
我试过检查@some_let 是否存在,我试过检查:some_let 的超级方法是否由kernel 拥有,它们都没有提供任何有用的东西;我无法访问 instance_methods 或 instance_method,因为 Rspec 不让我访问,并且在互联网上搜索方法也没有找到答案。
我希望能够做这样的事情:
shared_examples 'a shared example' do
let(:some_let) { let_exists?(:some_let) ? super() : some_new_value }
end
有没有像let_exists? 这样的方法?
【问题讨论】:
-
if defined?(super),也许吧? -
super总是被定义,问题是 RSpec 传播let块,因此每个嵌套上下文都有自己的let块版本,所以一旦它被定义它总是存在的。更糟糕的是,它甚至不能做像let(:let) { custom_defined_let || default_value }这样的事情,因为它只会错误custom_defined_let不存在 -
let(:some_let) { some_new_value } unless method_defined?(:some_let)会起作用,即仅在方法不存在时才定义它。 -
这不起作用,因为
some_let只存在于执行上下文中,而不存在于复杂上下文中,就像instance_method它被阻止了:( -
不确定你的意思......你能提供一个更完整的例子来说明你想要实现的目标吗?
标签: ruby rspec rspec-rails