Rspec共享示例:助手方法中的访问参数

Rspec共享示例:助手方法中的访问参数,rspec,Rspec,假设我创建了一个带有一个参数的Rspec共享示例组(测试的业务目的无关,它是我当前代码库的一个过于简化的版本): shared_examples“some example group”do|参数| 它“做某事”做什么 放置“参数=#{parameter}” 打印\u参数 结束 def print__参数 放置“参数=#{parameter}” 结束 结束 我可以将参数作为变量访问,只要使用它测试块即可。然而,当我试图从一个方法访问参数时,我遇到了一个“未定义的局部变量或方法”。为什么呢?我已经

假设我创建了一个带有一个参数的Rspec共享示例组(测试的业务目的无关,它是我当前代码库的一个过于简化的版本):

shared_examples“some example group”do|参数|
它“做某事”做什么
放置“参数=#{parameter}”
打印\u参数
结束
def print__参数
放置“参数=#{parameter}”
结束
结束
我可以将
参数作为变量访问
,只要使用
测试块即可。然而,当我试图从一个方法访问
参数时,我遇到了一个“未定义的局部变量或方法”。为什么呢?我已经在我的代码库中证明(并且通常在Rspec文档中显示)该参数在测试块、生命周期方法(如
before
)和
let
变量声明中可用。但是为什么不使用辅助方法呢


谢谢。

这是标准的Ruby作用域,传递给块的参数在块的闭包中可用。因此,在闭包中计算的字符串
“parameter=#{parameter}”
工作正常

您试图做的与此相同的事情是:

b = "Hi!"

def a
  puts b
end

a()
# NameError (undefined local variable or method `b' for main:Object)
解决方案是将参数包装在一个
let
,(注意,我强烈建议使用不同的名称以避免混淆优先级)

这与执行以下操作(大致相同):

b = "Hi!"

def a
  puts b
end

define_method(:b) { b }

a()
# Hi!
# => nil
b = "Hi!"

def a
  puts b
end

define_method(:b) { b }

a()
# Hi!
# => nil