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

相关问题