Rails 8 ships with built-in authentication, which simplifies login flows without requiring third-party gems like Devise. But with any new convention, there’s a learning curve—especially when writing tests.

If you’re writing controller tests with Minitest and running into issues after enabling authentication, you’re not alone. Here’s what you might see:

Problem: Unexpected Redirect to Login

You might get a test failure like this:

bash
CopyEdit

Failure:
TicketsControllerTest#test_should_get_index:
Expected response to be a <2XX: success>, but was a <302: Found> redirect to <http://www.example.com/session/new>

The Mistake

A common pitfall is using the wrong route for signing in. In Rails 8’s built-in auth, the route for signing in is:

sh
CopyEdit
POST /session
But many developers mistakenly use new_session_url, which is a GET request for the login form, not the login action.

The Fix: Use the Correct Route and Parameters

Update your test helper or controller test to use the proper login route like this:

ruby
CopyEdit

def sign_in(user)
  post session_url, params: { email_address: user.email_address, password: "password" }
end

Make sure this sign_in method is called before making authenticated requests in your tests.

Example Controller Test (Minitest)

ruby
CopyEdit

require "test_helper"
class TicketsControllerTest < ActionDispatch::IntegrationTest
  setup do
    @user = users(:one)
    sign_in(@user)
  end

  test "should get index" do
    get tickets_url
    assert_response :success
  end
  private
  def sign_in(user)
    post session_url, params: {
      email_address: user.email_address,
      password: "password"
    }
  end
end

Need Help With Ruby On Rails Development?

Work with our skilled Ruby on Rails developers to accelerate your project and boost its performance.

Hire Ruby on Rails Developer

Support On Demand!

Related Q&A