为什么RSpec在从ruby内部运行时运行规范两次并重新加载spec文件?

时间:2013-03-10 12:07:39

标签: ruby rspec jruby guard

我正在尝试在现有的ruby运行时中使用RSpec,并在每次文件更改时运行规范。这是因为JRuby和JVM启动时间。为了在每次运行时消除这种情况,我想启动ruby一次,然后只重新加载更改的文件并运行规范。我正在使用防护(具有不同的扩展)和监视器,但似乎都遇到了下面描述的问题。

我把问题解决了RSpec本身。问题是,当通过RSpec::Core::Runner.run多次运行RSpec时,它会正常工作,直到使用load重新加载spec文件。然后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

当从现有的ruby运行时运行时,有没有办法告诉RSpec清除后续运行之间的上下文?我还提到这是RSpec Core项目的问题#826

1 个答案:

答案 0 :(得分:1)

总结答案,以便从“未答复”过滤器中删除此问题...

根据RJHunter的观察,GitHub RSpec核心项目的解释已在此处记录:

https://github.com/rspec/rspec-core/issues/826#issuecomment-15089030

对于后代(如果上述链接死亡),以下是详细信息:

  

RSpec运行器已在内部调用load,第二次加载导致双运行问题。

     

我很快根据您的示例敲了一个脚本,重新运行单个spec文件,将规格更改为其他内容,然后重新运行它们,正确工作而不进行第二次加载

     

请参阅: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