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?
Test for controller (note that
subject
is the instance of the controller, assuming we're testing usingrspec-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)
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.