Я работал над тестами моего приложения 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
Дайте мне знать, если вам нужно увидеть что-то еще в моем приложении для решения проблемы, и любая помощь будет очень признательна!