요청 사양에서 ApplicationController 메서드를 스텁하는 방법
current_user
Rspec / 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
'Programing' 카테고리의 다른 글
MySQL 범위에서 누락 된 날짜를 채우는 방법은 무엇입니까? (0) | 2020.12.09 |
---|---|
web.xml을 사용하는 이유는 무엇입니까? (0) | 2020.12.09 |
std :: function을 복사해야합니까? 아니면 항상 참조 할 수 있습니까? (0) | 2020.12.09 |
Python3에서 __builtin__ 모듈은 어디에 있습니까? (0) | 2020.12.09 |
GCC에서 x86 어셈블리의 Intel 구문을 사용할 수 있습니까? (0) | 2020.12.09 |