Programing

요청 사양에서 ApplicationController 메서드를 스텁하는 방법

lottogame 2020. 12. 9. 07:40
반응형

요청 사양에서 ApplicationController 메서드를 스텁하는 방법


current_userRspec / capybara 요청 사양에서 메서드 의 응답을 스텁해야합니다 . 이 메서드는에 정의되어 ApplicationController있으며 helper_method를 사용하고 있습니다. 메소드는 단순히 사용자 ID를 반환해야합니다. 테스트 내에서이 메서드가 매번 동일한 사용자 ID를 반환하기를 바랍니다.

또는 session[:user_id]사양 을 설정 하여 문제를 해결할 수 current_user있지만 (반환 되는 것입니다 ) ...하지만 작동하지 않는 것 같습니다.

둘 중 하나가 가능합니까?

편집하다:

다음은 내가 가진 것입니다 (작동하지 않습니다. 정상적인 current_user 메서드를 실행합니다).

require 'spec_helper'

describe "Login" do

   before(:each) do
     ApplicationController.stub(:current_user).and_return(User.first)
   end

  it "logs in" do
    visit '/'
    page.should have_content("Hey there user!")
  end

end

또한 작동하지 않습니다.

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

skalee가 댓글에 정답을 제공 한 것 같습니다.

스텁하려는 메서드가 클래스 메서드가 아닌 인스턴스 메서드 (대부분)이면 다음을 사용해야합니다.

ApplicationController.any_instance.stub(:current_user)


다음은 기본 형식의 몇 가지 예입니다.

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

귀하의 특정 경우에 적절한 형식은 다음과 같습니다.

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

다음은 내가 작업하는 프로젝트의 전체 작업 예제입니다.

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

전체 예제를 설명하기 위해 기본적으로 이것이하는 일은 ActionController::InvalidAuthenticityToken앱에서 오류가 발생하면 플래시 메시지가 나타나고 사용자가 portals_controller#index작업으로 리디렉션 되는지 확인하는 것 입니다. 이러한 형식을 사용하여 특정 값을 스텁 아웃 및 반환하고, 발생한 특정 오류의 인스턴스를 테스트하는 등의 작업 .stub(:action_name).and_[do_something_interesting]()을 수행 할 수 있습니다. 사용할 수 있는 여러 메서드가 있습니다.


업데이트 (코드를 추가 한 후) : 내 의견에 따라 다음과 같이 코드를 변경합니다.

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

이것은 나를 위해 작동 @current_user하며 테스트에서 사용할 변수를 제공 합니다.

다음과 같은 도우미가 있습니다.

def bypass_authentication
  current_user = FactoryGirl.create(:user)

  ApplicationController.send(:alias_method, :old_current_user, :current_user)
  ApplicationController.send(:define_method, :current_user) do 
    current_user
  end
  @current_user = current_user
end

def restore_authentication
  ApplicationController.send(:alias_method, :current_user, :old_current_user)
end

그런 다음 요청 사양에서 다음을 호출합니다.

before(:each){bypass_authentication}
after(:each){restore_authentication}

For anyone else who happens to need to stub an application controller method that sets an ivar (and was stymied by endless wanking about why you shouldn't do that) here's a way that works, with the flavour of Rspec circa October 2013.

before(:each) do
  campaign = Campaign.create!
  ApplicationController.any_instance.stub(:load_campaign_singleton)
  controller.instance_eval{@campaign = campaign}
  @campaign = campaign
end

it stubs the method to do nothing, and sets the ivar on rspec's controller instance, and makes it available to the test as @campaign.


For Rspec 3+ the new api is:

For a controller test, nice and short:

allow(controller).to receive(:current_user).and_return(@user)

Or for all instances of ApplicationController:

allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@user)

None of the provided responses worked for me. As in @matt-fordam's original post, I have a request spec, not a controller spec. The test just renders the view without launching a controller.

I resolved this by stubbing the method on the view as described in this other SO post

view.stub(:current_user).and_return(etc)

참고URL : https://stackoverflow.com/questions/7448974/how-to-stub-applicationcontroller-method-in-request-spec

반응형