10.1.4 Michael Hartl 在 rails 上的 ruby 教程 TEST RED

10.1.4 michael hartl's ruby on rails tutorial TEST RED

我目前正在关注作者 Michael Hartl 在 Rails 上的 Ruby 教程。我被困在第 10.1.4 章,测试应该是绿色但目前是红色,这是错误消息:

Started with run options --seed 48963

 FAIL["test_valid_signup_information_with_account_activation", UsersSignupTest, 1.7533403700217605]
 test_valid_signup_information_with_account_activation#UsersSignupTest (1.75s)
        Failed assertion, no message given.
        test/integration/users_signup_test.rb:44:in `block in <class:UsersSignupTest>'

  41/41: [=========================================================================================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.78481s
41 tests, 173 assertions, 1 failures, 0 errors, 0 skips

这是包含主要错误(失败)的文件,根据报告应该是 'assert user.reload.activated?':

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.alert.alert-danger'
  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?
    get edit_account_activation_path(user.activation_token, email: 'wrong')
    assert_not is_logged_in?
    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

-

您还可以在 Git Repository

上查看我的存储库

如果有人能帮我解决这个问题,我将不胜感激,这会节省我宝贵的时间。

我认为问题归结为这两行:

assert_select 'div#<error_explanation>'
assert_select 'div.<alert alert-danger>'

这些必须是错误中概述的有效 CSS 选择器。他们不是。固定版本可能是:

assert_select 'div#error_explanation'
assert_select 'div.alert.alert-danger'

这真的取决于你的风格。记住这些工作就像 jQuery,所以它们类似于 $('div#error_explanation')

您的测试本身看起来不错,但当您断言用户在您尝试编辑其帐户激活信息后实际上已被激活时,它们似乎会失败:

get edit_account_activation_path(user.activation_token, email: user.email)
assert user.reload.activated? # <= test fails here

在您的存储库的 account_activations_controller.rb 文件中,您有:

def edit
  user = User.find_by(email: params[:email])
  if user && !user.activated? && user.authenticated?(:activation, params[:id])
    user.activate # <= here's where you're activating the user
    log_in user
    flash[:success] = "Account activated!"
    redirect_to user
  else
    flash[:danger] = "Invalid activation link"
    redirect_to root_url
  end
end

查看您的 user.rb class,但是,您似乎实际上完全错过了 activate 方法(很遗憾,错误消息似乎没有指出这个给你)。因此,将以下方法添加到您的 User 模型并再次尝试 运行 规格:

def activate
  update_columns(activated: true, activated_at: Time.current)
end

编辑

the point where your tests went red 查看您的存储库后,我现在可以看到这个问题出在您的 SessionsHelper#redirect_back_or 方法中:

def redirect_back_or(default)
  redirect_to(session[:forwarding_url] || default)
  session.delete[:forwarding_url]
end

session.delete[:forwarding_url] 应该是 session.delete(:forwarding_url),用圆括号代替方括号。