RSpec 构建消息的创建方法
RSpec create method for build message
我仍在学习如何使用 rspec 测试控制器。我有一个简单的消息应用程序,一个用户可以在其中创建消息给另一个用户(只有登录的用户才能写消息)。我没有使用设计来登录或注册用户,这个应用程序尽可能简单只是为了rspec学习。
我在 Messages
控制器中有 create
方法,我想测试它:
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
出现错误
expected Message.count
to have changed by 1, but was changed by 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
您需要设置 @current_user
才能让您的规范通过,即:
before do
user = User.create!(username: 'John', password: 'test123')
assign(:current_user, user)
end
请参阅 assign 文档以供参考
如果 assign @current_user
不起作用,尝试存根 current_user
而不是
before do
user = User.create!(username: 'John', password: 'test123')
allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user)
end
我仍在学习如何使用 rspec 测试控制器。我有一个简单的消息应用程序,一个用户可以在其中创建消息给另一个用户(只有登录的用户才能写消息)。我没有使用设计来登录或注册用户,这个应用程序尽可能简单只是为了rspec学习。
我在 Messages
控制器中有 create
方法,我想测试它:
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
出现错误
expected
Message.count
to have changed by 1, but was changed by 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
您需要设置 @current_user
才能让您的规范通过,即:
before do
user = User.create!(username: 'John', password: 'test123')
assign(:current_user, user)
end
请参阅 assign 文档以供参考
如果 assign @current_user
不起作用,尝试存根 current_user
而不是
before do
user = User.create!(username: 'John', password: 'test123')
allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(user)
end