使用 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
再次感谢,托马斯!
所以检查一下:它 出现 好像在 运行 宁 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
再次感谢,托马斯!