问题描述
我正在尝试在Rails中创建一个邮件测试,以检查Clearance sends的密码重置邮件。
/upload
调用<%= 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
错误?
解决方法
您可以解决此问题的一件事是
<%= link_to "Change my password",edit_user_password_url(@user,token: @user.confirmation_token&.html_safe) %>
使用&.
运算符,因此如果它为nil,则不会抛出异常。发生异常的原因可能是直接致电邮件程序,因此在测试中您已致电ClearanceMailer.change_password(@user)
,并且当用户单击“忘记密码”或其他操作时,会发送此电子邮件(意味着在发送电子邮件之前会发生一个过程)会在用户上设置确认令牌,并在发送电子邮件@user.confirmation_token
时出现。因此,要解决此问题,您可以:
- 使用上面指定的
&.
- 调用之前调用的方法来设置确认令牌
- 或者您可以手动设置随机确认令牌
user.update(confirmation_token: 'random text')
,因为这只是一项测试,您正在检查是否应发送电子邮件。