How to access a Rails controller view context from outside of a controller? How to access a Rails controller view context from outside of a controller? ruby-on-rails ruby-on-rails

How to access a Rails controller view context from outside of a controller?


Simpler than you think! (I lost almost an hour until I found a way)

You can instantiate an ActionView

_view_context = ActionView::Base.new

and use it in your test

FoobarPresenter.new(Foobar.new, _view_context)


How about testing the expectations?

  1. Test for controller (note that subject is the instance of the controller, assuming we're testing using 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: 1expect(assigns(:foobar)).to eql(foobar_presenter)
  2. Test for 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')


I unfortunately don't have a perfect answer for you. However, I've dug through the Draper Decorator library, and they have solved this problem.

In particular, they have a HelperProxy class and a ViewContext class that seem to automatically infer the context that you want.

https://github.com/drapergem/draper

They also have some specs around both of these classes, which I'm sure you could borrow from in setting up your own specs.