ruby-on-rails - #<ApplicationHelperTest :0x000000075bf4d0> 的未定义方法 `remember'

标签 ruby-on-rails ruby

我正在关注提到的教程 https://www.railstutorial.org/book/log_in_log_out .

当我使用给定命令执行测试时: 捆绑执行 rake 测试 TEST=test/helpers/sessions_helper_test.rb

我遇到以下错误:

1) 错误: ApplicationHelperTest#test_current_user_returns_nil_when_remember_digest_is_wrong: NoMethodError:未定义的方法remember' for #<ApplicationHelperTest:0x000000075bf4d0> test/helpers/sessions_helper_test.rb:7:in设置'

2)错误: ApplicationHelperTest#test_Current_user_returns_right_user_with_session_is_nill: NoMethodError:未定义的方法remember' for #<ApplicationHelperTest:0x00000007702400> test/helpers/sessions_helper_test.rb:7:in设置'


我在/apps/helpers/session_helper.rd 中定义了一个辅助类方法。 --记住方法是此类的一部分..仍然/test/helpers/sessions_helper_test 无法找到该方法。

/test/helpers/sessions_helper_test.rb 文件的代码是

require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase


  def setup
    @user = users(:michael)
    remember(@user)
  end

  test "Current_user returns right user with session is nill" do
    assert_equal @user, current_user
    assert is_logged_in?
  end

  test "current_user returns nil when remember digest is wrong" do
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_nil current_user
  end

end

这是模块 SessionsHelper 的代码

    module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Remembers a user in a persistent session.
  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  # Returns the current logged-in user (if any).
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token]) #here is an Evaluation Magic for a given Method
        log_in user
        @current_user = user
      end
    end
  end
  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

  # Logs out the current user. # Actions (Set digest to Nill) (Delete the Cookie) (Delete the Session) (Set current_user variable to nill)
  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end


  def forget(user)
    user.forget # is to forget the user .. means set th remember_digest to nill -- Go to User Model
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

end

Users.yml 文件是:

# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

michael:
  name: Michael Example
  email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="573a3e343f36323b17322f363a273b327934383a" rel="noreferrer noopener nofollow">[email protected]</a>
  password_digest: <%= User.digest('password') %>

archer:
  name: Sterling Archer
  email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="81e5f4e2e9e4f2f2c1e4f9e0ecf1ede4afe6eef7" rel="noreferrer noopener nofollow">[email protected]</a>
  password_digest: <%= User.digest('password') %>

-----------------得到解决方案--------------------------------

您需要包含 HelperModule 来测试模块.. 修复 test/helpers/sessions_helper_test.rb 的代码后将如下所示

require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  include SessionsHelper # This line is added to  code.



  def setup
    @user = users(:michael)
    remember(@user)
  end

  test "Current_user returns right user with session is nill" do
    assert_equal @user, current_user
    assert is_logged_in?
  end

  test "current_user returns nil when remember digest is wrong" do
    @user.update_attribute(:remember_digest, User.digest(User.new_token))
    assert_nil current_user
  end

end

最佳答案

按照教程进行操作,也遇到了类似的问题。您可以通过更新您的类来避免使用 include:

class ApplicationHelperTest < ActionView::TestCase

至:

class SessionsHelperTest < ActionView::TestCase   

关于ruby-on-rails - #<ApplicationHelperTest :0x000000075bf4d0> 的未定义方法 `remember',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27621524/

相关文章:

ruby-on-rails - Rails 4中的虚拟属性

ruby-on-rails - 页面内容的 Rails 常量

javascript - 在表单提交期间渲染 js.erb 文件 ajax Rails

ruby - 如何在 ruby​​ 的正则表达式中执行此操作?

mysql - 删除父节点但不删除具有 Awesome_nested_set 的子节点?

ruby-on-rails - SQL 语句的 Rails 4 作用域

ruby-on-rails - `name' :String 的未定义方法 "SystemTimer"

ruby-on-rails - 如何使用Rails使用两个关系i18n yaml文件以一种形式很好地显示?

ios - 如果没有身份验证,Spotify 搜索 API 是否不再可用?

ruby-on-rails - Rails 设计 "Fingerprinting"