Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

"@controller is nil" error in ActionController::TestCase #5

Open
sunaku opened this Issue · 4 comments

2 participants

@sunaku

When using context() inside an ActionController::TestCase, I get the following error:

RuntimeError: @controller is nil: make sure you set it in your test's setup method.

Here is an example of what my test file looks like:

class ExamplesControllerTest < ActionController::TestCase
  context "index action" do
    should "return a list of examples" do
      get :index, :format => :json
      assert_response :success
    end
  end
end

The error is happening because context() creates a new Test::Unit::TestCase derived class whose name does not contain "ExamplesController", and so Rails becomes confused when it tries to automatically set @controller inside of the context() body.

Thanks for your consideration.

@ghost

A workaround / solution is to assign @controller an instance of the controller you're testing in a block passed to setup().

@retr0h

Is this gem so awesome, that no one maintains it anymore?

@sunaku

It is indeed disheartening, @retr0h. There is always opportunity for improvement / increasing popularity!

@sunaku

I wrote the following monkeypatch to automate @robgleeson's suggestion of setting @controller as a workaround for the problem:

class ActionController::TestCase
  def self.context *args, &block
    super *args do
      setup do
        # establish the rails controller being tested
        # https://github.com/citrusbyte/contest/issues/5#issuecomment-677003
        ancestors = self.class.ancestors
        test_case = ancestors[ancestors.index(ActionController::TestCase) - 1]
        @controller = test_case.controller_class.new
      end
      class_eval &block
    end
  end
end

Put that in your test/test_helper.rb and things will Just Work. Cheers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.