首页 > 解决方案 > 无法在 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

如果您需要在我的应用程序中查看其他内容来解决问题,请告诉我,任何帮助将不胜感激!

标签: ruby-on-railstestingpost

解决方案


我可以通过向我的教授夹具添加密码摘要字段并一起跳过创建用户而只是登录来解决此问题。我仍然不确定为什么通过发布到professionals_path来创建教授在我的工作中不起作用案例,所以如果有人知道答案,请告诉我。


推荐阅读