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.
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')