我一直在研究Hartl的RoR教程,并且已经坚持了一段时间。我正在尝试使用以下命令运行帐户激活测试:
$ bundle exec rake test
我最终得到了这个:
1) Failure:
UsersSignupTest#test_valid_signup_information_with_account_activation [/Users/*name/blogger1/test/integration/users_signup_test.rb:44]:
Failed assertion, no message given.
这是我的users_signup_test.rb文件中的测试代码:
require 'test_helper'
class UsersSignupTest < ActionDispatch::IntegrationTest
def setup
ActionMailer::Base.deliveries.clear
end
test "invalid signup information" do
get signup_path
assert_no_difference 'User.count' do
post users_path, user: { name: "",
email: "user@invalid",
password: "foo",
password_confirmation: "bar" }
end
assert_template 'users/new'
assert_select 'div#error_explanation'
assert_select 'div.field_with_errors'
end
test "valid signup information with account activation" do
get signup_path
assert_difference 'User.count', 1 do
post users_path, user: { name: "Example User",
email: "user@example.com",
password: "password",
password_confirmation: "password" }
end
assert_equal 1, ActionMailer::Base.deliveries.size
user = assigns(:user)
assert_not user.activated?
# Try to log in before activation.
log_in_as(user)
assert_not is_logged_in?
# Invalid activation token
get edit_account_activation_path("invalid token")
assert_not is_logged_in?
# Valid token, wrong email
get edit_account_activation_path(user.activation_token, email: 'wrong')
assert_not is_logged_in?
# Valid activation token
get edit_account_activation_path(user.activation_token, email: user.email)
assert user.reload.activated?
follow_redirect!
assert_template 'users/show'
assert is_logged_in?
end
end
当我按照教程操作时,我正在按照代码并自行输入代码。但是,这一次,我回过头来复制粘贴所有问题。关于它可能是什么的任何想法?
第44行是:
assert user.reload.activated?
但是我找不到其他地方可以相关的东西吗?
答案 0 :(得分:0)
昨天我遇到了同样的问题,问题不在于测试,而是在'激活?'方法本身无法正常工作。
我通过追溯'激活'来找到解决方案?输入错误的方法,在我的例子中,我在用户模型的create_activation_digest方法中找到了它。
希望这有帮助。
答案 1 :(得分:0)
我有完全相同的问题并解决了它。 就我而言,原因是缺少AccountActivationsController中的log_in(user)方法。
请确保您在AccountActivationsController中登录成功激活的用户。
class AccountActivationsController < ApplicationController
def edit
user = User.find_by(email: params[:email])
if user && !user.activated? && user.authenticate_with_token(:activation, params[:id])
user.activate
**log_in user**
flash[:success] = "Account activated!"
redirect_to user
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end
end
Michael Hartl的Ruby on Rails Tutorial
答案 2 :(得分:-1)
确保更改经过身份验证的布尔值?方法:return false if digest.nil?
。我的错误源于此。