Ссылка для подтверждения в тестовой среде Rails отображает: Запрещено. У вас нет прав доступа к / пользователи / подтверждения на этом сервере. - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть класс User, который использует devise :confirmable, который при создании пользователя вызывает отправку электронного письма со ссылкой для подтверждения. Это прекрасно работает в development и production, но не работает в среде test (Minitest / Capybara). В частности, щелкнув ссылку подтверждения, вы получите **Forbidden** You don't have permission to access /users/confirmation on this server.

Скриншот:

Запрещено У вас нет прав доступа / пользователей / подтверждения на этом сервере

Как ни странно, когда я создаю пользователя из rails console, как и в интеграционном тесте, он работает. Итак, почему он не работает в среде test?

Тест:

u = FactoryBot.create(:user)
email = ActionMailer::Base.deliveries.last
plain_part = email.multipart? ? (email.text_part ? email.text_part.body.decoded : nil) : email.body.decoded
confirmation_link = plain_part[/<a href="(http:\/\/.*)">Confirm my account<\/a>/,1]
puts "--- #{confirmation_link} ---" # visual check of extracted URL
visit confirmation_link # Forbidden You don't have permission...
save_and_open_screenshot # saves to tmp/capybara/capybara-*.png

А на консоли:

require 'factory_bot'
# factory creation code omitted from here
u = FactoryBot.create(:user)
# produces and renders link

Такие ссылки подтверждения выглядят так во всех средах, кроме test:

http://localhost:3000/users/confirmation?confirmation_token=TxYdRmVzcuPE7PAx7yJh

... а в test они выглядят так:

http://localhost/users/confirmation?confirmation_token=NqyaVL5EKEnz46zMzDQs

(Порт не указан в test.)

Я использую Rails 5.2.0 с драйвером Capybara selenium_chrome_headless в этих интеграционных тестах.

1 Ответ

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

Это связано с тем, что сгенерированный в электронном письме URL-адрес не указывает на сервер Capybara. Есть несколько способов это исправить. Два самых простых решения были бы

  1. Исправьте порт, на котором Capybara запускает свой тестовый сервер, и установите параметры генерации электронной почты

    Capybara.server_port = 1111 # any fixed port number
    
    # in config/environments/test.rb
    config.action_mailer.default_url_options = {:host => 'localhost', port: '1111'} # match whatever server host and port Capybara is running on
    
  2. Продолжайте разрешать Capybara работать на произвольном порту, настраивайте генерацию URL-адреса, чтобы он не включал порт, и настройте Capybara так, чтобы он всегда включал порт сервера, если явно не указан другой порт

    Capybara.always_include_port = true
    
    # in config/environments/test.rb
    config.action_mailer.default_url_options = {:host => 'localhost'} # match the host Capybara is running the test server on
    
...