Rails密码重置邮件程序测试未定义方法“ html_safe”错误使用Clearance gem

问题描述

我正在尝试在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时出现。因此,要解决此问题,您可以:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...