Rails RSpec撬“重装!”

问题描述 投票:0回答:1
  • 红宝石2.3.1
  • 铁轨(3.2.22.4)
  • rspec-rails(2.14.2)
  • 撬轨(0.3.2)
  • pry-byebug(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调试断点中没有。

如何在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工作)。

ruby-on-rails rspec-rails pry-rails
1个回答
1
投票

好的,我刚刚发现它。

我唯一需要改变的是:

配置/环境/ test.rb

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

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

© www.soinside.com 2019 - 2024. All rights reserved.