首页 > 解决方案 > 使用 rspec 和 capybara 测试 Jekyll 站点,在 rspec 开始时得到一个奇怪的竞赛案例

问题描述

所以检查一下:似乎在运行时,和 puma/rspec 的启动bundle exec rspec之间存在竞争。jekyll serve有时我运行命令,我的测试运行良好。其他时候,我的每个规范文件都会出错: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

我的 .rspec 只包含两行: --color
--require spec_helper

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

嘿嘿!

标签: rubyrspeccapybarajekyll

解决方案


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

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

sleep 0.1 while <jekyll app>.compiling?

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

注意:还要检查我对您的测试的评论,这些测试实际上并没有测试任何东西。


推荐阅读