我正在尝试在现有的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。
答案 0 :(得分:1)
总结答案,以便从“未答复”过滤器中删除此问题...
根据RJHunter的观察,GitHub RSpec核心项目的解释已在此处记录:
https://github.com/rspec/rspec-core/issues/826#issuecomment-15089030
对于后代(如果上述链接死亡),以下是详细信息:
RSpec运行器已在内部调用load,第二次加载导致双运行问题。
我很快根据您的示例敲了一个脚本,重新运行单个spec文件,将规格更改为其他内容,然后重新运行它们,正确工作而不进行第二次加载
上述要点包含:
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