Skip to main content

How to test helpers in Rails with Devise current_user and ActionView::TestCase

Chris Oliver December 2, 2019

Recently I was trying to test a couple of helpers I had written in Rails. Basic helpers are pretty easily tested using ActionView::TestCase, but what happens when you want to use Devise' current_user method in your helpers? We have to actually write our own method to stub out Devise current_user in our test suite so that we can return the correct user.

Let's take a very trivial example of a helper that depends upon current_user. Here we have a current_team method that returns the first team for the user.

module ExampleHelper
  def current_team
    @current_team ||= current_user.teams.first
  end
end

The current_resource method in Devise is not a helper, but a method in ApplicationController, so it's not available in ActionView::TestCase even if it was exposed with helper_method :current_user in the controller.

To write tests for this, we need to actually implement the current_user method in our test suite.

require 'test_helper'

class ExampleHelperTest < ActionView::TestCase
  def current_user
    @current_user
  end

  setup do
    @current_user = users(:one)
  end

  test "current_team" do
    assert_not_nil current_team
  end
end

Everything is run in the context of our ActionView::TestCase class, so the helpers have access to the methods inside our test suite.

What we've done here is defined the current_user method and have it simply return an instance variable. This lets us change the value of current_user at any time in our tests which can come in handy. Our test will call the current_team helper, then call our current_user method defined in ExampleHelperTest and use that instead of the Devise method.

P.S. You might enjoy following me on Twitter.


Loading...

Subscribe to the newsletter

Join 27,623+ developers who get early access to new screencasts, articles, guides, updates, and more.

    By clicking this button, you agree to the GoRails Terms of Service and Privacy Policy.

    More of a social being? We're also on Twitter and YouTube.