У меня есть простое приложение для сообщений, чтобы узнать RSpec, где один пользователь может создавать сообщения другому пользователю (только зарегистрированные пользователи могут писать сообщения).Я не использовал devise или FactoryBot, это приложение настолько просто, насколько это возможно только для обучения rspec.
Я хотел запустить эти тесты для контроллера сессий, но второй (когда пользователь имеет недопустимые параметры) дает мнеошибка Expected response to be a <3XX: redirect>, but was a <200: OK>
и я не понимаю почему с часов.
RSpec.describe SessionsController, type: :controller do
let(:create_user) { @user = User.create(username: 'John', password: 'test123') }
describe 'POST #create' do
context 'when user is logged in' do
it 'loads correct user details and redirect to the root path' do
create_user
post :create, params: { session: { username: @user.username, password: @user.password } }
expect(response).to redirect_to(root_path)
end
end
context 'when user has invalid params' do
before do
create_user
post :create, params: { session: { username: @user.username, password: 'somepass' } }
end
it 'render new action' do
expect(assigns(:user)).not_to eq create_user
expect(response).to redirect_to(action: 'new')
end
end
end
end
Sessions Controller
class SessionsController < ApplicationController
before_action :logged_in_redirect, only: %i[new create]
def new; end
def create
user = User.find_by(username: params[:session][:username])
if user && user.authenticate(params[:session][:password])
session[:user_id] = user.id
flash[:success] = 'You have successfully logged in'
redirect_to root_path
else
flash.now[:error] = 'There was something wrong with your login'
render 'new'
end
end
end
Я не совсем уверен, соответствует ли строка expect(assigns(:user)).not_to eq create_user
соглашение, но это не имеет значения для результата.