Я все еще учусь тестировать контроллеры с помощью rspec.У меня есть простое приложение для сообщений, где один пользователь может создавать сообщения другому пользователю (только зарегистрированные пользователи могут писать сообщения).Я не использовал devise для входа в систему или регистрации пользователей, это приложение настолько просто, насколько это возможно, только для обучения rspec.
У меня есть create
метод в Messages
контроллерах, которые я хочу протестировать:
class MessagesController < ApplicationController
before_action :require_user
def create
message = current_user.messages.build(message_params)
if message.save
redirect_to root_path
end
end
private
def message_params
params.require(:message).permit(:body)
end
end
Вот моя спецификация
RSpec.describe MessagesController, type: :controller do
describe 'signed user' do
before do
user = User.create!(username: 'John', password: 'test123')
end
describe 'GET #create' do
it 'create message' do
expect do
post :create, params: { message: { body: 'Please work!' } }
end.to change(Message, :count).by(1)
expect(response).to have_http_status(:redirect)
end
end
end
end
С ошибкой
ожидалось, что Message.count
изменится на 1, но был изменен на 0
Я думаю, что я должен войти в систему пользователя, но как это сделать без использования заводского бота?
РЕДАКТИРОВАТЬ Как предлагается в комментарии, это должно быть полезно
class ApplicationController < ActionController::Base
helper_method :current_user, :logged_in?
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def logged_in?
!!current_user
end
def require_user
if !logged_in?
flash[:error] = 'You must be logged in to perform that action'
redirect_to login_path
end
end
end