我正在学习在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;
}
答案 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])
^^^^^^^^
可能这是一个偏离主题的问题,因为它是关于代码中的一个简单错字。