【问题标题】:How to use let variables in rails console?如何在rails控制台中使用let变量?
【发布时间】:2018-07-04 07:44:37
【问题描述】:

使用

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 变量?

【问题讨论】:

  • 简短的回答是否定的,let 是一个 RSpec 名称,不能从控制台工作。此外,create 可能是FactoryBot.create 的简写,在控制台中也很难使用。
  • 在 Rails 控制台中使用 let 有什么好处,而不是简单地定义一个变量?
  • @moveson,仅供参考,我们可以在控制台中使用create
  • @maxpleaner,在规范中定义了多个 let 变量,为了验证控制台中每个 let 变量的工作,需要删除 let ,这非常忙碌且耗时.
  • @Rhunal 恐怕你说的没有道理。您能否发布一些您正在尝试做的事情以及原因的示例。

标签: ruby rspec rails-console


【解决方案1】:

如果你对 let 只是创建全局变量没问题,你可以像这样 polyfill 它:

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 之类的断点工具。

【讨论】:

  • 感谢@maxplener。方法很长,但按预期工作。
  • 建议是否有任何内置的 let 方法,因此通过仅使用 require 该方法将减少每次重新启动控制台时定义 let 方法的工作。
  • 没有,但是如果您将此方法定义添加到文件(例如 let.rb)中,您可以通过 irb/rails 控制台通过传递 -r ./let.rb 标志来加载它,例如irb -r ./let.rb。帮自己一个忙,尽管调查一下 pry 或 byebug
  • 值得注意的是,Max 的实现更像rspec 中的let!,在某种意义上它会急切地执行块——只要它被调用。见stackoverflow.com/questions/10173097/…
【解决方案2】:

rspec 中的let 只不过是一个延迟执行和记忆的方法定义。如果你必须在 irb 中有你可以这样定义它:

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

   define_method sym do
     $let[sym] ||= yield
   end
 end

require './let 在 irb 中或将其放在 .irbrc 中,您就有了类似 rspec 的 let。请注意,rspec 在每个新示例(itspecify 块)中重新评估 let。由于您在 irb 中没有它们,您可能需要手动清除您的 let 缓存 ($let = {}) 以强制重新评估。

【讨论】:

  • 在控制台中定义方法后,得到错误为:1.9.3-p0 :049 > let(:user) { create_user } NoMethodError: undefined method define_method' for main:Object from (irb):45:in let'
  • 在 1.9.3 中,您改为使用 Object.send(:define_method, sym) do。但实际上,您应该只升级您的 ruby​​ ))。 1.9.3 是一个古老的历史。
猜你喜欢
  • 2013-02-28
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2019-10-24
  • 2012-11-12
  • 2013-07-04
相关资源
最近更新 更多