Разработать приемочный тест для входа в систему с капибарой - PullRequest
1 голос
/ 14 февраля 2020

Уже есть несколько вопросов о стековом потоке с возможными решениями, но ни один из них, похоже, не решил мою проблему, поэтому я задаю еще один, в надежде, что его достаточно c, чтобы его нельзя было закрыть как дубликат.

Я пытаюсь протестировать настроенную форму входа в систему, которая использует devise. Среда состоит из

  • рельсов 6.0
  • rspe c -рельсов 3.9
  • капибара 3.31
  • селен-webdriver 3.142.7
  • database_cleaner 1.8

Следующее spe c не выполнено из-за ответа 401 Unauthorized, при котором форма входа снова отображается с сообщением об ошибке, что учетные данные были неправильными.

require 'rails_helper'

feature 'Logging in' do
  background do
    FactoryBot.create :user, email: 'john.doe@example.com',
                             first_name: 'John',
                             password: 'password',
                             password_confirmation: 'password'
  end

  scenario 'with correct credentials' do
    visit new_user_session_path

    within('#user-sessions--new') do
      find('#user_email').fill_in with: 'john.doe@example.com'
      find('#user_password').fill_in with: 'password'
    end

    find('input[name="commit"]').click
    expect(page).to have_content 'John'
  end
end

Проверяя test.log после временного отключения фильтров параметров для ведения журнала, я вижу, что пароль был отправлен правильно, и пользователь создается до того, как произойдет попытка входа, но аутентификация не удалась. При входе в сеанс интерактивной отладки и попытке входа в систему вручную в раскрученном браузере капибары, вход также не выполняется. Имя пользователя для входа по электронной почте и паролю работает в режиме разработки при создании того же пользователя через консоль. В настоящее время не используются никакие другие функции, которые могли бы повлиять на поведение при входе в систему (например, confirmable).

Большинство вопросов, которые я нашел до сих пор, рекомендуют следующие пункты:

Отключить фиксации транзакций: My rails_helper.rb уже содержит это;

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end

Настроить очиститель базы данных: Это было предложено в Не удалось протестировать Devise с Capybara и это уже имело место до того, как я начал реализовывать спецификации капибары;

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(
      :truncation,
      except: %w[ar_internal_metadata schema_migrations]
    )
  end

  config.before :each do
    DatabaseCleaner.start
  end

  config.after :each do
    DatabaseCleaner.clean
  end
end

Сейчас у меня нет другой идеи, почему этот сценарий может давать сбой, за исключением, может быть, среды, в которой тесты запускаются горячими, имея правильное подключение к базе данных. Если у кого-то есть идея, которая помогает, я буду рад ее услышать.

1 Ответ

1 голос
/ 15 февраля 2020

При использовании Rails> 5.0 он безопасно разделяет соединение с базой данных между тестами и запускается тестируемое приложение Capybara. Из-за этого вам не нужен очиститель базы данных, и вы должны использовать транзакционные тесты для повышения скорости и изоляции. Начните с удаления всех ссылок на очиститель базы данных из вашего проекта и повторного включения транзакционных фиксаторов (по умолчанию). Если это не решит вашу проблему, тогда есть пара других потенциальных проблем.

  1. На вашем заводе не создается действительный пользователь - используйте функцию FactoryBot.lint для проверки всех ваших фабрик создавать действительные объекты перед вашими тестами - https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#linting -factories

  2. На вашей странице есть ошибка JS, которая вызывает проблемы. В режиме разработки каждый JS ресурс обслуживается отдельно, что означает, что ошибка в одном не влияет на другие. Однако в тестовом режиме все активы объединяются, что означает, что ошибка в одном из них может привести к тому, что JS в других ресурсах не будет запущен. Проверьте консоль браузера на наличие ошибок JS и исправьте их.

Если ничего из этого не помогло, добавьте соответствующие части вашего test.log к своему вопросу

Примечание : Вы пишете свои тесты более многословно, чем нужно. Если при размещении полей в fill_in по идентификатору вы можете просто передать идентификатор в fill_in и не нужно использовать отдельные вызовы find для каждого элемента, вы также должны использовать более semanti c click_button, когда элемент, в котором вы находитесь попытка клика квалифицируется как кнопка

 within('#user-sessions--new') do
  fill_in 'user_email', with: 'john.doe@example.com'
  fill_in 'user_password', with: 'password'
end

click_button('commit')
expect(page).to have_content 'John'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...