1

我正在尝试创建一个将返回存根类的 lambda。这就是我所拥有的:

engine_stub = lambda { |valid|
  Class.new {
    def valid?(address)
      valid
    end
  }
}

lambda 应该返回一个类,其valid?实例方法总是返回传递给 lambda 的值。此代码因错误而失败:

NameError: undefined local variable or method `valid' for #<#<Class:0x007f4bf0ebd
0f0>:0x007f4bf0ebcd08>

很明显,该方法无法访问 lambda 范围。我也试过这个:

engine_stub = lambda { |valid|
  stub_class = Class.new
  def stub_class.valid?(address)
    valid
  end
  return stub_class
}

而是导致此错误:

NoMethodError: undefined method `valid?' for #<#<Class:0x007fecbada1138>:0x007fec
bada0df0>

所以现在我没有创建valid?一个实例变量。

概括

我试图让 lambdaengine_stub返回一个具有一个实例方法的类,该实例方法valid?返回传递给 lambda 的值。我该怎么做呢?

4

2 回答 2

6

关键字def是范围门,因此您应该通过以下方式定义方法define_method{}

engine_stub = -> valid do
  Class.new { define_method :valid? do valid end }
end
于 2013-06-07T09:11:24.767 回答
0

我怀疑您需要此存根进行测试。在 rspec 的情况下,您可能应该创建存根而不是类,或者如果您的代码确实需要提供类:

engine_stub = stub_chain(:new, :valid?, valid)
于 2013-06-07T12:15:36.770 回答