Тестирование сайта Jekyll с использованием rspec и capybara, получение причудливого случая гонки на старте rspec

Так что проверьте это: кажется, после запуска bundle exec rspecгонка между jekyll serve и пума / 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 и error out. Вероятно, он работает правильно, возможно, один раз из трех или пяти попыток. Все остальное время я получаю следующие ошибки:

Вот как выглядит мой 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

HEEELLLLLP!

2 ответа

Решение

Похоже, что при создании сайта jekyll меняет текущий каталог, который, поскольку он запускается в потоке, также влияет на тесты, которые пытается выполнить RSpec (см. https://bugs.ruby-lang.org/issues/9785 для Зачем Dir.chdir не является потокобезопасным) - приводит к попыткам загружать вещи из неправильных мест.

Потенциальным решением этой проблемы было бы подождать, пока сайт Jekyll будет создан, прежде чем запускать ваши тесты. Комментарий в вашем spec_helper кажется, утверждают, что кто-то думал прохождение force_build: true будет делать это, но от быстрого прочтения jekyll-rack код, я не думаю, что это правда, и вам на самом деле нужно ждать compiling? вернуть ложь (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

Примечание. Также проверьте мой комментарий о ваших тестах, которые на самом деле ничего не тестируют.

Согласно супер полезным ответам Томаса Уолпола, это закончилось тем, что сработало:

спать 0,1, пока Capybara.app.com собираем?

вставлено сразу после:

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

в моем spec_helper.rb

Еще раз спасибо, Томас!

Другие вопросы по тегам