我正在通过创建“普通的旧Ruby”演示者对象来清理一些依赖于某些自定义控制器辅助方法的代码。在我的控制器中,我能够将视图上下文传递给类:
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项目。
答案 0 :(得分:7)
比你想象的更简单! (在我找到方法之前,我失去了将近一个小时)
您可以实例化ActionView
_view_context = ActionView::Base.new
并在测试中使用它
FoobarPresenter.new(Foobar.new, _view_context)
答案 1 :(得分:5)
测试期望怎么样?
测试控制器(注意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)
测试演示者:
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')
答案 2 :(得分:2)
我很遗憾没有给你一个完美的答案。但是,我已经挖掘了Draper Decorator库,他们已经解决了这个问题。
特别是,它们有一个HelperProxy类和一个ViewContext类,它们似乎可以自动推断出你想要的上下文。
https://github.com/drapergem/draper
他们也有一些关于这两个类的规范,我相信你可以在设置你自己的规范时借用。