Невозможно создать пользователя и войти в систему теста rails - PullRequest
0 голосов
/ 31 марта 2020

Я работал над тестами моего приложения rails и заметил, что некоторые из моих тестов провалились после того, как я добавил функцию входа в систему, так как представления используют текущий user_id из переменной сеанса, которая не была определена во время тестирования.

Я попытался исправить это, создав запрос на публикацию, чтобы создать пользователя (пользователь может быть профессором или студентом для моего приложения), а затем войти в систему с этим пользователем внутри теста:

courses_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

Sessions Controller

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"}} 

Я попытался добавить случайный маркер authenticity_token к параметрам, жестко закодировав все строки в параграфе. мс вместо использования объекта @user, а также удаления и воссоздания, миграции, загрузки и подготовки моей тестовой базы данных, и не повезло.

Github repo: https://github.com/ditsky/team-formation-app

Дайте мне знать, если вам нужно увидеть что-то еще в моем приложении для решения проблемы, и любая помощь будет очень признательна!

1 Ответ

0 голосов
/ 16 апреля 2020

Мне удалось это исправить, добавив поле дайджеста пароля к своему устройству «Профессор» и пропустив создание пользователя все вместе и вместо этого просто войдя в систему. Я все еще не уверен, почему создание профессора путем публикации в professors_path не работать в моем случае, поэтому, если кто-нибудь знает ответ на этот вопрос, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...