В Rails 5.2 с Capybara не похоже, что мои ресурсы загружаются - PullRequest
0 голосов
/ 21 ноября 2018

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

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

Меня немного смущает, что именно происходит, так как я не вижу своих сценариев, когда я сплю, мой тест 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: "test@tester.com"
    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 загружается, но скрипты, загруженные манифестом для страницы, не являются.

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

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

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

rake assets:clean
rake assets:precompile

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

0 голосов
/ 22 ноября 2018

Похоже, вы не используете правильное ожидание.Поскольку вы можете вызывать 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 секунд, если в этом нет необходимости.

...