3

"일반 오래된 루비"발표자 개체를 만들어 일부 사용자 지정 컨트롤러 도우미 메서드에 의존하는 코드를 정리하고 있습니다. 내 컨트롤러에서보기 컨텍스트를 클래스에 전달할 수 있습니다.컨트롤러 외부에서 레일스 컨트롤러보기 컨텍스트에 액세스하는 방법은 무엇입니까?

def show 
    # old code: view_context.bad_helper_method 
    @foobar = FoobarPresenter.new(Foobar.find(params[:id]), view_context) 
end 

class FoobarPresenter 
    def initialize(model, view_context) 
    @model = model 
    @view_context = view_context 
    end 

    def something 
    @view_context.bad_helper_method 
    end 
end 

그러나 테스트에 통과해야 할 항목이 확실하지 않습니다. 차라리 helper/view_context를 동적으로 가져 와서 전달할 필요가 없습니다.

컨트롤러 외부의보기/컨트롤러 도우미 컨텍스트에 어떻게 액세스합니까?

이것은 Rails 3.2 프로젝트입니다.

답변

3

기대 테스트는 어떻습니까? 발표자에 대한

view_context  = double("View context") 
foobar_presenter = double("FoobarPresenter") 

allow(subject).to receive(:view_context).and_return(view_context) 
allow(FoobarPresenter).to receive(:new).with(1, view_context).and_return(foobar_presenter) 

get :show, id: 1 

expect(assigns(:foobar)).to eql(foobar_presenter) 
  • 시험 :

    view_context = double('View context', bad_helper_method: 'some_expected_result') 
    presenter = FoobarPresenter.new(double('Model'), view_context) 
    
    expect(presenter.something).to eql('some_expected_result') 
    
  • 를 컨트롤러에 대한

    1. 테스트 (우리는 rspec-rails를 사용하여 테스트하는 가정, subject 컨트롤러의 인스턴스이다)

    +0

    아마도 이것이 최선의 방법이라고 생각합니다. 감사! – Andrew

    2

    불행히도 당신에게 완벽한 대답이 없습니다. 그러나, 나는 Draper Decorator 라이브러리를 파헤 치고이 문제를 해결했습니다.

    특히 HelperProxy 클래스와 원하는 컨텍스트를 자동으로 유추하는 ViewContext 클래스가 있습니다.

    https://github.com/drapergem/draper

    그들은 또한 당신이 당신의 자신의 스펙을 설정하는에서 빌릴 수있는 확신이 클래스, 모두 주위에 몇 가지 사양이있다.

    +0

    에서 사용할 수 있습니다 (나는 방법을 찾아 낼 때까지 나는 거의 한 시간 손실). 나는 근원을 파헤쳐 내가 뭔가를 찾을 수 있는지 알아볼 것이다. – Andrew

    3

    생각보다 간단합니다!

    당신은 ActionView

    _view_context = ActionView::Base.new 
    

    를 인스턴스화하고 테스트하는 것이 좋습니다

    FoobarPresenter.new(Foobar.new, _view_context) 
    
    +0

    고마워요! 나는 레일 콘솔에서 하나의 인스턴스를 만들려고했는데, 이것은 나를 위해 그것을했다. –

    관련 문제