#ruby-on-rails #ruby #testing #actionmailer #minitest
#ruby-on-rails #ruby #тестирование #actionmailer #minitest
Вопрос:
Я пытаюсь создать тест почтовой программы в Rails, чтобы проверить почтовую программу для сброса пароля, которую отправляет Clearance.
В представлении почтовой программы для сброса пароля по умолчанию есть эта ссылка:
<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_token.html_safe) %>
Кажется, что вызов html_safe
— это хорошо, но в моем тестировании почтовой программы я продолжаю получать эту ошибку:
Minitest::UnexpectedError: ActionView::Template::Error: undefined method `html_safe' for nil:NilClass
Did you mean? html_safe?
Я не могу понять, почему это происходит. Вот мой тест почтовой программы на данный момент:
require "test_helper"
class PasswordResetMailerTest < ActionMailer::TestCase
setup do
@user = users(:elvis)
end
test "password reset email" do
email = ClearanceMailer.change_password(@user)
# Send the email, then test that it got queued
assert_emails 1 do
email.deliver_now
end
end
end
Почему это вызывает undefined method html_safe
ошибку?
Ответ №1:
Единственное, что вы можете сделать, чтобы устранить проблему, это:
<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_tokenamp;.html_safe) %>
Используя amp;.
оператор, поэтому, если он равен нулю, он не выдаст исключение. Причиной исключения может быть прямой вызов почтовой программы, поэтому в вашем тесте вы вызвали, ClearanceMailer.change_password(@user)
и это электронное письмо отправляется, когда пользователь нажимает на «Забыли пароль» или что-то еще (означает, что перед отправкой электронного письма выполняется процесс), который устанавливает токен подтверждения для пользователя и когда электронное письмо отправлено @user.confirmation_token
присутствует. Итак, чтобы исправить это, вы можете:
- Используйте
amp;.
, как указано выше - Вызовите метод, вызванный до этого, чтобы установить токен подтверждения
- Или вы можете установить случайный токен подтверждения вручную
user.update(confirmation_token: 'random text')
, поскольку это всего лишь тест, и вы проверяете, должно ли быть доставлено электронное письмо.
Комментарии:
1. Спасибо!
amp;
Оператор не был нужен. Это просто потому, что я еще не сгенерировал токен для пользователя, поэтому добавление@user.update(confirmation_token: 'random text')
к моей настройке сделало свое дело. Большое спасибо!