Почему RSpec запускает спецификации дважды при запуске из ruby и файл спецификаций перезагружается?
Я пытаюсь использовать RSpec из существующей среды исполнения ruby и запускать спецификации каждый раз, когда файл изменяется. Это из-за времени запуска JRuby и JVM. Чтобы устранить это при каждом запуске, я бы хотел запустить ruby один раз, затем только перезагрузить измененные файлы и запустить спецификации. Я использовал guard (с различными расширениями) и watchr, но все, похоже, страдают от проблемы, описанной ниже.
Я прибил проблему к самому RSpec. Проблема в том, что при запуске RSpec через RSpec::Core::Runner.run
несколько раз работает нормально, пока файл спецификации не будет перезагружен с помощью load
, Затем RSpecs запускает спецификации дважды. Я создал пример проекта, показывающего эту проблему в прямом эфире: https://github.com/mostr/rspec_double_run_issue
Ниже приведен пример вывода:
ruby run_spec_in_loop.rb
Running spec from within ruby runtime
.
Finished in 0.00047 seconds
1 example, 0 failures
loading spec file via 'load' as if it was changed and we wanted changes to be picked up
Running spec from within ruby runtime
..
Finished in 0.001 seconds
2 examples, 0 failures
Есть ли способ сказать RSpec очистить свой контекст между последующими запусками при запуске из существующей среды исполнения ruby? Я также поднял это как проблему № 826 для проекта RSpec Core.
1 ответ
Обобщая ответ здесь, чтобы убрать этот вопрос из фильтра "Без ответа"...
Согласно наблюдению RJHunter, объяснение было задокументировано для проекта GitHub RSpec Core здесь:
https://github.com/rspec/rspec-core/issues/826
Для потомков (в случае, если вышеупомянутая ссылка умирает), вот подробности:
Бегунок RSpec уже вызывает нагрузку изнутри, ваша вторая загрузка является причиной проблемы двойного запуска.
Я быстро выбрал скрипт, основанный на вашем примере, который перезапускает один файл спецификаций, изменяет спецификации на что-то другое, затем перезапускает их, работает правильно без второй загрузки
Смотрите: https://gist.github.com/JonRowe/5192007
Вышеупомянутый Гист содержит:
require 'rspec'
spec_file = 'spec/sample_spec.rb'
File.open(spec_file, 'w') { |file| file.write 'describe { specify { expect(true).to eq false } }' }
1.upto(5) do |i|
puts "Running spec from within ruby runtime"
::RSpec::Core::Runner.run([spec_file], STDERR, STDOUT)
#rewriting the spec file
File.open(spec_file, 'w') { |file| file.write "describe { specify { expect(#{i}).to eq false } }" }
end