Рельсы RSpec Pry "перезагрузи!" - PullRequest
0 голосов
/ 11 марта 2019
  • ruby ​​2.3.1
  • рельсы (3.2.22.4)
  • rspec-рельсы (2.14.2)
  • рельсы (0.3.2)
  • pry-byebug (3.6.0)
  • pry (0.10.4)

Я использую немного старую версию Ruby и Rails.

Я выполняю тесты RSpec в терминале Ubuntu:

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, меняем имя метода с foo1 на foo2, вызываем reload! - тогда эти вызовы работают нормально:

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

Но - когда я делаю то же самое в точке отладки RSpec - он фактически не перезагружает код - даже если я вручную определяю reload! с помощью любого из2 способа:

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).

1 Ответ

1 голос
/ 11 марта 2019

ОК, я только что нашел.

Единственное, что мне нужно было изменить, это:

конфиг / окружающая среда / test.rb

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

Теперь в точках останова RSpec я могу успешно перезагрузить измененный код, вызвав reload! - точно так же, как в консоли Rails.

...