3

我正在清理一些依賴於一些自定義控制器輔助方法的代碼,方法是創建一個「普通的舊Ruby」演示者對象。在我的控制,我能夠給視圖上下文傳遞給類:如何從控制器外部訪問Rails控制器視圖上下文?

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

測試期望值如何?

  1. 試驗控制器(注意subject是控制器的情況下,假設我們使用測試rspec-rails):

    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) 
    
  2. 演示者測試:

    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') 
    
+0

我認爲這可能是最好的方法。謝謝! – Andrew 2015-01-10 00:48:12

2

我不幸沒有一個完美的答案給你。但是,我已經通過Draper Decorator庫挖掘出來了,他們已經解決了這個問題。

特別是,他們有一個HelperProxy類和一個ViewContext類,它們似乎可以自動推斷出你想要的上下文。

https://github.com/drapergem/draper

他們也有圍繞這兩個類,我敢肯定,你可以在設置自己的規格借的一些規格。

+0

這是一個好主意,用它。我會挖掘來源,看看我能找到什麼。 – Andrew 2015-01-10 00:28:23

3

比你想象的要簡單! (我失去了將近一個小時,直到我找到了一種方法)

可以實例化的ActionView

_view_context = ActionView::Base.new 

並在測試

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

謝謝!我試圖在軌道控制檯中實例化一個,並且這爲我做了。 – 2017-05-19 17:38:22

相關問題