Ruby on rails测试错误

时间:2015-12-18 10:39:30

标签: ruby-on-rails ruby

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

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

这是我在test_helper.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

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

这是我的create_categories_test.rb的代码

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

我的登录控制器:

// Changed return type:
std::vector<std::string> fileReader(char* fileName){
  ifstream treeFile;
  treeFile.open(fileName);
  string line;

  std::vector<std::string>  fileContents;
  /// int rows=0, columns=0;

  while (getline(treeFile, line )){
      fileContents.push_back(line);
      rows++;
  }

  // Cut off rest of code, instead:
  return fileContents;
}

1 个答案:

答案 0 :(得分:1)

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

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

post array [{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])
                                      ^^^^^^^^

可能这是一个偏离主题的问题,因为它是关于代码中的一个简单错字。