Почему 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
Другие вопросы по тегам