如何在rails控制台中使用let变量?

时间:2018-01-25 05:51:11

标签: ruby rspec rails-console

使用

rspec 2.6.4
rails 3.1.6

如何在rails测试控制台中使用let变量?

1.9.3-p0 :032 > let(:user) { create(:user) }
NoMethodError: undefined method `let' for main:Object

请告知,这里需要哪个图书馆?

例如:下面是在控制台中执行的,用于在控制台中使用stub方法。

require 'rspec/mocks/standalone'

是否可以在rails控制台中定义和调用let变量?

2 个答案:

答案 0 :(得分:2)

如果只使用let创建全局变量就可以了,可以这样填充:

def let(name)
  Object.send :instance_variable_set, "@#{name}", yield
  Object.send :define_method, name do
    Object.send :instance_variable_get, "@#{name}"
  end
end

用法与rspec相同:

irb(main):007:0> let(:foo) { 1 }
=> :foo
irb(main):008:0> foo
=> 1

虽然你真的不应该将测试代码粘贴到控制台中进行调试。使用像pry或byebug这样的断点工具要好得多。

答案 1 :(得分:2)

let中的

rspec只不过是一个懒惰的执行和记忆方法定义。如果你必须有irb,你可以这样定义:

 $ cat let.rb
 def let(sym)
   $let ||= {}

   define_method sym do
     $let[sym] ||= yield
   end
 end
在irb中

require './let或将其放在.irbrc中,并且您拥有类似rspec的let。请注意,rspec会在每个新示例(letit块中重新评估specify。由于您没有使用irb,因此您可能需要手动清除let缓存($let = {})以强制重新评估。