0
  • 红宝石 2.3.1
  • 导轨 (3.2.22.4)
  • rspec-rails (2.14.2)
  • 撬轨 (0.3.2)
  • 撬拜虫(3.6.0)
  • 撬 (0.10.4)

我使用的是旧版本的 Ruby 和 Rails。

我在 Ubuntu 终端中运行 RSpec 测试:

rspec ./spec/features/some_spec.rb

我正在使用pry断点(binding.pry- 在我的 RSpec 测试中)。

reload!在调试这些断点中的代码时缺少该方法(仅在 RSpec 下)。(我的意思是动态地重新加载更改的模型代码 - 比如动态添加新方法等。)这个方法甚至没有在那里定义。我确实有reload!在 Rails 控制台中定义和工作的方法 - 但不是在 RSpec 调试断点中。

如何reload!在 RSpec 中设置?

我尝试了pry gem 如何重新加载的解决方案?,但都不适合我。

这似乎是最接近真正的解决方案:https ://stackoverflow.com/a/50966785/6594668 ,它确实定义了reload!- 但这reload!没有任何作用。

快速示例:

class User < ActiveRecord::Base
  def foo1
    p 123
  end
end

当我运行 Rails 控制台时,将方法名称从 更改foo1foo2,调用reload!- 然后这些调用可以正常工作:

User.first.foo1
=> 123
#change the method name (by manually editing the file)
User.first.foo2
=> 123

但是 - 当我在 RSpec 调试断点中做同样的事情时 - 它实际上并没有重新加载代码 - 即使我reload!用两种方式中的任何一种手动定义:

1. https://stackoverflow.com/a/50966785/6594668

def reload!(print=true)
  puts "Reloading..." if print
  ActionDispatch::Reloader.cleanup!
  ActionDispatch::Reloader.prepare!
  true
end

2. https://github.com/rweng/pry-rails/issues/99#issuecomment-364272642

Object.send(:include, Rails::ConsoleMethods)

看起来我仍然缺少一些东西(reload!在 RSpec 中工作)。

4

1 回答 1

1

好的,我刚刚找到了。

我唯一需要改变的是:

配置/环境/test.rb

MyApp::Application.configure do
  # config.cache_classes = true
  config.cache_classes = false
end

现在在 RSpec 断点中,我可以通过调用成功地重新加载更改的代码reload!- 与 Rails 控制台中的方式完全相同。

于 2019-03-11T09:42:23.203 回答