Тестирование сайта 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
Еще раз спасибо, Томас!