Ошибка почтовой программы для сброса пароля Rails с неопределенным методом `html_safe’ (с использованием Clearance gem)

#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 присутствует. Итак, чтобы исправить это, вы можете:

  1. Используйте amp;. , как указано выше
  2. Вызовите метод, вызванный до этого, чтобы установить токен подтверждения
  3. Или вы можете установить случайный токен подтверждения вручную user.update(confirmation_token: 'random text') , поскольку это всего лишь тест, и вы проверяете, должно ли быть доставлено электронное письмо.

Комментарии:

1. Спасибо! amp; Оператор не был нужен. Это просто потому, что я еще не сгенерировал токен для пользователя, поэтому добавление @user.update(confirmation_token: 'random text') к моей настройке сделало свое дело. Большое спасибо!