RSpec创建消息的方法

时间:2018-12-06 21:37:58

标签: ruby-on-rails rspec rspec-rails

我仍在学习如何使用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

我认为我必须登录用户,但是如何在不使用工厂bot的情况下登录?

编辑 如评论中所建议,这应该很有用

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

1 个答案:

答案 0 :(得分:2)

您需要设置@current_user才能通过规范,即:

 before do
    user = User.create!(username: 'John', password: 'test123')
    assign(:current_user, user)
 end

请参阅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