ruby-on-rails - 无法在 Rails 测试中创建用户和登录
问题描述
我正在处理我的 Rails 应用程序的测试,并注意到在添加登录功能后我的一些测试失败了,因为视图使用会话变量中的当前 user_id,该变量在测试期间未定义。
我试图通过创建一个发布请求来创建一个用户(用户可以是我的应用程序的教授或学生)然后在测试中使用该用户登录来解决这个问题:
course_controller_test.rb
setup do
@course = courses(:one)
@user = professors(:admin)
end
test "should get new" do
professor_http_code = post professors_path, params: {professor: {firstname:@user.firstname,
lastname: @user.lastname,
email: @user.email,
password: "123456",
password_confirmation: "123456"}}
puts "Professor post http code: " + professor_http_code.to_s
login_http_code = post login_path, params: {email: @user.email,
password: "123456",
type: {field: "professor"}}
puts "Login post http code: " + login_http_code.to_s
get new_course_url
assert_response :success
end
测试失败并出现同样的问题(呈现视图时没有当前用户)并在控制台中产生以下输出:
控制台输出
Running via Spring preloader in process 22449
Run options: --backtrace --seed 26071
# Running:
.Professor create params: <ActionController::Parameters {"firstname"=>"foo", "lastname"=>"bar", "email"=>"foobar@gmail.com", "password"=>"123456", "password_confirmation"=>"123456"} permitted: false>
Professor not saved to db
..Professor post http code: 200
user login params: #<Professor id: 135138680, firstname: "foo", lastname: "bar", email: "foobar@gmail.com", created_at: "2020-03-31 02:12:50", updated_at: "2020-03-31 02:12:50", password_digest: nil>
Login post http code: 500
F
Failure:
CoursesControllerTest#test_should_get_new [/home/sruditsky/Homework/Capstone/team-formation-app/test/controllers/courses_controller_test.rb:25]:
Expected response to be a <2XX: success>, but was a <500: Internal Server Error>
这是我的会话和教授控制器功能,它们正在处理请求:
教授控制器
class ProfessorsController < ApplicationController
...
def create
@professor = Professor.new(professor_params)
puts "Professor create params: " + params[:professor].inspect
respond_to do |format|
if @professor.save
puts "password_d: " + @professor.password_digest
log_in(@professor, "professor")
format.html { redirect_to @professor, notice: 'Professor was successfully created.' }
format.json { render :show, status: :created, location: @professor }
else
puts "Professor not saved to db"
format.html { render :new }
format.json { render json: @professor.errors, status: :unprocessable_entity }
end
end
end
...
# Never trust parameters from the scary internet, only allow the white list through.
def professor_params
params.require(:professor).permit(:firstname, :lastname, :email, :password, :password_confirmation)
end
会话控制器
class SessionsController < ApplicationController
...
def create
user = nil
type = params[:type][:field]
if type == "student"
user = Student.find_by_email(params[:email])
elsif type == "professor"
user = Professor.find_by_email(params[:email])
end
puts "user login params: " + user.inspect
if user && user.authenticate(params[:password])
puts "logging in"
log_in(user, type)
redirect_to root_url, notice: "Logged in!"
else
puts "invalid password"
flash.now[:alert] = "Email or password is invalid"
render "new"
end
end
...
控制台输出显示教授没有保存到数据库中,但在应用程序上创建教授帐户工作正常,而且当我在测试环境中的 rails 控制台中键入以下内容时,它工作正常:
app.post "/professors", params: {professor: {firstname: "foo", lastname: "bar", email: "foobar@gmail.com", password: "123456", password_confirmation: "123456"}}
我尝试向参数添加随机的authentity_token,对参数中的所有字符串进行硬编码而不是使用@user 对象,然后删除并重新创建、迁移、加载和准备我的测试数据库,但都没有运气。
Github 仓库:https ://github.com/ditsky/team-formation-app
如果您需要在我的应用程序中查看其他内容来解决问题,请告诉我,任何帮助将不胜感激!
解决方案
我可以通过向我的教授夹具添加密码摘要字段并一起跳过创建用户而只是登录来解决此问题。我仍然不确定为什么通过发布到professionals_path来创建教授在我的工作中不起作用案例,所以如果有人知道答案,请告诉我。
推荐阅读
- android - 如何在 Android 中为内容观察者或提供者注册您的主机名作为提供者?
- git - 尝试 git merge 中止没有任何错误
- php - 如何使用 Laravel 连接三个表并保持数据完整性
- javascript - JavaScript - 如何强制当前窗口处于活动状态?
- javascript - 在 eCharts 热图中显示字符串值
- sql - 将表连接到子查询
- java - 针对静态方法的“target()”切入点的 AspectJ 警告“Xlint:adviceDidNotMatch”
- python - 使用 scipy 对数正态分布拟合具有小值的数据,然后在 matplotlib 中显示
- java - 如何将 Java 8 安装到 Google Compute Debian 8 实例上?
- sockets - 如何使 tnethttpclient 支持 socks 4/5 代理 delphi