I am working on cleaning up some code that relies on some custom controller helper methods, by creating a "plain old Ruby" presenter object. In my controller, I am able to pass the view context to the class:
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
However, I'm not sure what to pass in my test. I would rather pull the helper/view_context dynamically so that I don't have to pass it in.
How can I access the view/controller helper context outside of the controller?
This is a Rails 3.2 project.
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 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: 1
expect(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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With