【问题标题】:Ruby on rails test errorRuby on rails 测试错误
【发布时间】:2015-12-18 19:52:40
【问题描述】:

我正在学习为 ruby​​ on rails 应用程序进行测试,但我似乎遇到了问题。我正在尝试登录用户,因为我无权访问这两个测试中的 session[:user_id]。所以我在 test_helper 中创建了一个方法,在我的 create_categories_test 中定义了这些方法,它们运行,但是当我为它们设置登录时,它返回此错误:

(byebug) post login_path session: [{username: user.username, password: password}]
*** NoMethodError Exception: undefined method `[]' for nil:NilClass

这是我在 test_helper.rb 中的辅助方法

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Add more helper methods to be used by all tests here...
  def sign_in_as(user, password)
    post login_path, session: {username: user.username, password: password}
  end
end

注意:我在我的方法中放置了一个调试器并运行了返回 nil 的同一行代码(出于某种原因)

这是我的 create_categories_test.rb 的代码

def setup
  @user = User.create(username: "John", email: "john@doe.com",    password: "password", admin: true)
end

test "get new category form and create category" do
  sign_in_as(@user, "password")
  get new_category_path
  assert_template 'categories/new'
  assert_difference 'Category.count' do
    post_via_redirect categories_path, category: {name: "sports"}
  end
  assert_template 'categories/index'
  assert_match "sports", response.body
end

test "invalid category submission results in failure" do
  sign_in_as(@user, "password")
  get new_category_path
  assert_template 'categories/new'
  assert_no_difference 'Category.count', 1 do
    post categories_path, category: {name: " "}
  end
  assert_template 'categories/new'
  assert_select 'h2.panel-title'
  assert_select 'div.panel-body'    
end

我的登录控制器:

class SessionsController < ApplicationController
  def new  
  end  

  def create
    user = User.find_by(username: params[:sessions][:username])
    if user  && user.authenticate(params[:sessions][:password])
      session[:user_id] = user.id
      flash[:success] = "You have successfully logged in"
      redirect_to user_path(user)
    else
      flash.now[:danger] = "There was something wrong with your login details"
      render 'new'
    end
  end

  def destroy
    session[:user_id] = nil
    flash[:success] = "You have successfully logged out"
    redirect_to root_path
  end
end

【问题讨论】:

  • 请出示您的登录控制器,这就是问题所在。
  • 我已经添加了我的登录控制器
  • 您可以添加您的new 视图吗?

标签: ruby-on-rails ruby


【解决方案1】:

我在post 方法中假设您的params 存在问题:

post login_path session: [{username: user.username, password: password}]  

postarray [{username: user.username, password: password}],但控制器期望 hash

post login_path session: {username: user.username, password: password}  

也是您的登录助手:

#session: {}
post login_path, session: {username: user.username, password: password}
                 ^^^^^^^

但控制器期望:

#sessions: {}
user = User.find_by(username: params[:sessions][:username])
                                      ^^^^^^^^

这可能是题外话,因为它是关于代码中的一个简单的错字。

【讨论】:

    猜你喜欢
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多