使用 rspec 和水豚测试 Jekyll 站点,在 rspec 开始时出现奇怪的赛跑情况

Testing a Jekyll site with rspec and capybara, getting a bizarre race-case on rspec start

所以检查一下:它 出现 好像在 运行 宁 bundle exec rspec 之后,jekyll serve 和 puma/rspec的启动。有时我 运行 命令,而我的测试 运行 很好。其他时候,我的每个规范文件都出现错误:cannot load such file -- /path/to/project/sitename_jekyll/_layouts/spec/form_spec.rb,这很有趣,因为我的规范文件所在的位置不在那里。他们在 /path/to/project/sitename_jekyll/spec/form_spec.rb。

疯狂的是我可以一遍又一遍地重新 运行 命令,有时它会通过并且 运行 在正确的位置进行规范测试,并且有时它会在 _layouts 中查找它们并出错。它可能 运行 是正确的,也许在每三到五次尝试中就有一次。所有其他时候我都会收到以下错误:

这是我的 spec_helper.rb 的样子:https://gist.github.com/johnhutch/2cddfafcde0485ff021501d5696c0c2d

这是一个示例测试文件: https://gist.github.com/johnhutch/a35d15c170f5fd9ca07998bf035d111d

My .rspec 只包含两行: --颜色
--require spec_helper

这里是输出,包括成功的和不成功的,背靠背: https://gist.github.com/johnhutch/7927d609170ef5c70a595735502b128d

HEEELLLLLP!

这听起来像是 jekyll 在构建站点时正在更改当前目录,因为它在线程中 运行 也会影响测试 RSpec 正在尝试 运行(请参阅 https://bugs.ruby-lang.org/issues/9785 以了解为什么 Dir.chdir 不是线程安全的)- 导致尝试从不正确的位置加载内容。

一个潜在的解决方案是在实际 运行 测试之前等待 Jekyll 站点构建完成。您的 spec_helper 中的评论似乎表明有人认为通过 force_build: true 可以做到这一点,但通过快速阅读 jekyll-rack 代码,我认为那不是真的,您实际上需要等待for compiling? to return false (v 0.5) (complete? to return true in the current master branch) 以确保构建完成(以及传递 force_build).这可以在循环睡眠和检查中完成(更简单)

sleep 0.1 while <jekyll app>.compiling?

或(如果使用主分支)通过 mutex/conditional Rack::Jekyll 像在其测试套件中一样公开 - https://github.com/adaoraul/rack-jekyll/blob/master/test/helper.rb#L49

注意:另请查看我对您的测试的评论,这些测试实际上并未测试任何内容。

根据 Thomas Walpole 的超级有用的回复,这最终奏效了:

睡眠 0.1 而 Capybara.app.compiling?

紧接着插入:

51 Capybara.app = Rack::Jekyll.new(force_build: true)

在我的 spec_helper.rb

再次感谢,托马斯!