В Rails 5.2 с Capybara не похоже, что мои активы загружаются

Я пытаюсь запустить интеграционные тесты на Rails, используя RSpec Capybara и драйвер selenium-chrome.

Я также использую гем capybara-angular.

Я немного смущен тем, что именно происходит, поскольку я не вижу свои сценарии, когда я сплю, мой тест rspec проверяет вкладку источников в отладчике Chrome, похоже, что мои активы не загружены, хотя кажется, что операторы ng-if работают, поскольку страница скрыта.

Так что я не совсем уверен, что происходит. Страница работает, как и ожидалось, в процессе разработки, но переменные в $scope не устанавливаются в тесте.

Это моя настройка в "system.rb

   RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end
  config.before(:each, type: :system, js: true) do
    driven_by :selenium_chrome
  end
end

require "capybara-screenshot/rspec"
include Capybara::Angular::DSL

Вот тест, который я запускаю:

it "shows changes to the budget when the budget is changed", :js do
    visit(root_path)
    sleep 0.5
    fill_in "inputEmail", with: "[email protected]"
    fill_in "password", with: "test"
    click_on("Log In")
    sleep 0.25
    click_on("Budgeting")

    sleep 10
     expect(page).to  have_selector("#current_project_name", text: "Project A")
     expect(page).to have_selector("#budgetInput1")

    fill_in "#budgetInput1", with: "100"
    # Fail on next line with 'expected to find visible css "#budgetInput1" but there were no matches'
    page.should have_selector("#budgetInput1", text: "100") # <--test fails with
  end

Насколько я могу судить, причина, по которой он не найден, заключается в том, что элемент появляется в div с ng-if="showBudget". $scope.showBudget=true установлен в контроллере, но контроллер, похоже, не загружается, а {{showBudget==unknown}} возвращает true, что предполагает, что AngularJS загружается, но скрипты, загруженные манифестом для страницы, нет.

Как это исправить?


person GGizmos    schedule 21.11.2018    source источник


Ответы (2)


Похоже, вы не используете правильное ожидание. Поскольку вы можете вызывать fill_in для элемента с идентификатором budgetInput1, то ожидание (не уверен, почему вы смешиваете синтаксис expect и should) с параметром text не сработает. То, что вы, вероятно, хотите, это

expect(page).to have_field('budgetInput1', with: '100')

Если вместо этого вы ожидаете, что fill_in вызовет обновление на странице, которое заменит элемент ввода с идентификатором 'budgetInput1' другим элементом, то вам, вероятно, потребуется отправить ввод, вкладку или щелкнуть за пределами исходного элемента, чтобы вызвать изменение.

С другой стороны, я не уверен, почему у вас есть сон в вашем тесте - fill_in будет ждать существования соответствующего элемента, поэтому действительно не должно быть необходимости спать полсекунды после вызова визита - для 10-секундного сна (вашему приложению действительно требуется 10 секунд, чтобы ответить???) вместо этого вы можете просто использовать опцию ожидания для expect(page).to have_selector("#current_project_name", text: "Project A", wait: 10), чтобы тест продолжался, как только элемент существует, а не ждал все 10 секунд, если в этом нет необходимости.

person Thomas Walpole    schedule 22.11.2018
comment
Спасибо. Сны были просто для того, чтобы иметь возможность посмотреть на страницу, а также эксперимент, чтобы увидеть, поможет ли добавление задержки в случае, если тесты будут запущены до завершения загрузки углового кода. Не уверен, почему fill_in работал, а have_selector не работал, может быть, потому что поле существовало, но не было видно? В любом случае теперь все работает нормально. - person GGizmos; 22.11.2018

Проблема оказалась немного в другом, чем я думал. Когда я посмотрел на вкладку источников, в разработке я использовал большой список файлов, включая все, что указано в моем манифесте. В тесте капибары все эти файлы, включая jquery и angular, объединяются в один файл. jquery находится вверху, а внизу, примерно в строке 40000, были мои файлы контроллера angular. Проблема заключалась в том, что созданный файл не был основан на последних версиях моих активов javascript.

rake assets:clean
rake assets:precompile

Обычно это не было необходимо при разработке, изменения, которые я делаю в своих js-файлах, сразу же подхватываются, но я думаю, что это требуется при запуске тестов Capybara с селеновым хромом.

person GGizmos    schedule 22.11.2018