How to stub ApplicationController method in request spec

前端 未结 6 1462
难免孤独
难免孤独 2020-12-12 18:16

I am needing to stub the response of a current_user method in an Rspec/capybara request spec. The method is defined in ApplicationController and is

6条回答
  •  天命终不由人
    2020-12-12 18:28

    Here are a couple of examples of the basic form.

    controller.stub(:action_name).and_raise([some error])
    controller.stub(:action_name).and_return([some value])
    

    In your particular case, I believe the proper form would be:

    controller.stub(:current_user).and_return([your user object/id])
    

    Here's a full working example from a project I work on:

    describe PortalsController do
    
      it "if an ActionController::InvalidAuthenticityToken is raised the user should be redirected to login" do
        controller.stub(:index).and_raise(ActionController::InvalidAuthenticityToken)
        get :index
        flash[:notice].should eql("Your session has expired.")
        response.should redirect_to(portals_path)
      end
    
    end
    

    To explain my full example, basically what this does is verify that, when an ActionController::InvalidAuthenticityToken error is raised anywhere in the app, that a flash message appears, and the user is redirected to the portals_controller#index action. You can use these forms to stub out and return specific values, test an instance of a given error being raised, etc. There are several .stub(:action_name).and_[do_something_interesting]() methods available to you.


    Update (after you added your code): per my comment, change your code so it reads:

    require 'spec_helper'
    
    describe "Login" do
    
       before(:each) do
          @mock_controller = mock("ApplicationController") 
          @mock_controller.stub(:current_user).and_return(User.first)
       end
    
      it "logs in" do
        visit '/'
        page.should have_content("Hey there user!")
      end
    
    end
    

提交回复
热议问题