Rails 密码重置邮件程序测试未定义方法 `html_safe' 错误(使用 Clearance gem)

Rails password reset mailer test undefined method `html_safe' error (using Clearance gem)

我正在尝试在 Rails 中创建一个邮件程序测试以检查 Clearance sends.

的密码重置邮件程序

密码重置邮件程序的默认视图中有此 link:

<%= 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 错误?

您可以通过以下方式解决此问题:

<%= link_to "Change my password",
edit_user_password_url(@user, token: @user.confirmation_token&.html_safe) %>

使用 &. 运算符,因此如果它为 nil,则不会抛出异常。异常的原因可能是直接调用邮件程序,所以在你的测试中你调用了 ClearanceMailer.change_password(@user) 并且当用户点击忘记密码或其他东西时发送这封电子邮件(意味着在发送电子邮件之前发生了一个过程)它在用户身上设置确认令牌,当发送电子邮件时 @user.confirmation_token 存在。因此,要解决此问题,您可以:

  1. 使用上面指定的&.
  2. 调用之前调用的方法设置确认令牌
  3. 或者您可以手动设置一个随机确认令牌 user.update(confirmation_token: 'random text') 因为这只是一个测试,您正在检查电子邮件是否应该送达。