我使用的是旧版本的Ruby和Rails。
我正在Ubuntu终端中运行RSpec测试:
rspec ./spec/features/some_spec.rb
我正在使用pry
断点(binding.pry
- 在我的RSpec测试中)。
在调试这些断点中的代码时,我错过了reload!
方法(仅限RSpec)。 (我的意思是动态重新加载已更改的模型代码 - 比如即时添加新方法等)。此方法甚至没有定义。我确实已经定义了reload!
方法并在Rails控制台中工作 - 但是在RSpec调试断点中没有。
如何在RSpec中设置reload!
?
我尝试了pry gem how to reload?上的解决方案,但都没有为我工作。
这个似乎是最接近真正的解决方案:https://stackoverflow.com/a/50966785/6594668,它确实定义了reload!
- 但这个reload!
什么都不做。
快速示例:
class User < ActiveRecord::Base
def foo1
p 123
end
end
当我运行Rails控制台时,将方法名称从foo1
更改为foo2
,调用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工作)。
好的,我刚刚发现它。
我唯一需要改变的是:
配置/环境/ test.rb
MyApp::Application.configure do
# config.cache_classes = true
config.cache_classes = false
end
现在在RSpec断点中,我可以通过调用reload!
成功地重新加载更改的代码 - 这与Rails控制台中的方式完全相同。