Bird
Raised Fist0
Ruby on Railsframework~5 mins

Integration tests in Ruby on Rails

Choose your learning style10 modes available
Introduction

Integration tests check if different parts of your Rails app work well together. They help find problems that unit tests might miss.

When you want to test how a user logs in and sees their dashboard.
When you need to check if submitting a form saves data correctly and shows a confirmation.
When you want to verify that clicking links moves between pages as expected.
When you want to test how multiple models and controllers interact in a real scenario.
Syntax
Ruby on Rails
require 'test_helper'

class UserFlowsTest < ActionDispatch::IntegrationTest
  test "user can log in and see dashboard" do
    get login_path
    assert_response :success
    post login_path, params: { session: { email: 'user@example.com', password: 'password' } }
    follow_redirect!
    assert_select 'h1', 'Dashboard'
  end
end

Integration tests use ActionDispatch::IntegrationTest in Rails.

You simulate user actions like visiting pages, submitting forms, and following redirects.

Examples
Visit the home page and check if it loads successfully.
Ruby on Rails
get root_path
assert_response :success
Submit a form to create a user and check if it redirects to the new user's page.
Ruby on Rails
post users_path, params: { user: { name: 'Alice', email: 'alice@example.com' } }
assert_redirected_to user_path(User.last)
After a redirect, check if the page shows a welcome message inside a paragraph with class 'notice'.
Ruby on Rails
follow_redirect!
assert_select 'p.notice', 'Welcome!'
Sample Program

This test simulates a user visiting the login page, submitting their email and password, and then seeing a welcome message on the redirected page.

Ruby on Rails
require 'test_helper'

class LoginFlowTest < ActionDispatch::IntegrationTest
  test "user logs in and sees welcome message" do
    get login_path
    assert_response :success

    post login_path, params: { session: { email: 'user@example.com', password: 'password' } }
    assert_response :redirect

    follow_redirect!
    assert_response :success
    assert_select 'h1', 'Welcome, user@example.com!'
  end
end
OutputSuccess
Important Notes

Integration tests are slower than unit tests because they simulate real user actions.

Use fixtures or factories to set up test data before running integration tests.

Check HTML elements with assert_select to verify page content.

Summary

Integration tests check how parts of your app work together from a user's view.

They simulate visiting pages, submitting forms, and following redirects.

Use ActionDispatch::IntegrationTest and helper methods like get, post, and assert_select.

Practice

(1/5)
1. What is the main purpose of integration tests in a Rails application?
easy
A. To test individual methods in models
B. To test only the views without backend logic
C. To check database schema correctness
D. To check how different parts of the app work together from a user's perspective

Solution

  1. Step 1: Understand integration test scope

    Integration tests simulate user actions and check multiple parts working together.
  2. Step 2: Compare options with integration test purpose

    Only To check how different parts of the app work together from a user's perspective describes testing how parts work together from a user's view.
  3. Final Answer:

    To check how different parts of the app work together from a user's perspective -> Option D
  4. Quick Check:

    Integration tests = user perspective checks [OK]
Hint: Integration tests simulate user actions across components [OK]
Common Mistakes:
  • Confusing integration tests with unit tests
  • Thinking integration tests only check views
  • Assuming integration tests test database schema
2. Which of the following is the correct way to start an integration test class in Rails?
easy
A. class UserFlowsTest < ApplicationController
B. class UserFlowsTest < ActionDispatch::IntegrationTest
C. class UserFlowsTest < ActiveRecord::Base
D. class UserFlowsTest < ActionController::TestCase

Solution

  1. Step 1: Identify the base class for integration tests

    Rails integration tests inherit from ActionDispatch::IntegrationTest.
  2. Step 2: Check each option's base class

    Only class UserFlowsTest < ActionDispatch::IntegrationTest inherits from ActionDispatch::IntegrationTest, others are for models or controllers.
  3. Final Answer:

    class UserFlowsTest < ActionDispatch::IntegrationTest -> Option B
  4. Quick Check:

    Integration test class inherits ActionDispatch::IntegrationTest [OK]
Hint: Integration tests inherit from ActionDispatch::IntegrationTest [OK]
Common Mistakes:
  • Using ActiveRecord::Base which is for models
  • Using ApplicationController which is for controllers
  • Using ActionController::TestCase which is for controller tests
3. Given this integration test code snippet:
test "visit home page" do
  get root_path
  assert_response :success
  assert_select "h1", "Welcome"
end

What does assert_select "h1", "Welcome" check?
medium
A. That the page contains an <h1> tag with text exactly 'Welcome'
B. That the page has any <h1> tag regardless of text
C. That the response status is 404
D. That the page redirects to another URL

Solution

  1. Step 1: Understand assert_select usage

    assert_select checks HTML elements and their content in the response body.
  2. Step 2: Analyze the parameters "h1" and "Welcome"

    It looks for an <h1> tag with text exactly matching "Welcome".
  3. Final Answer:

    That the page contains an <h1> tag with text exactly 'Welcome' -> Option A
  4. Quick Check:

    assert_select checks HTML element and text [OK]
Hint: assert_select checks HTML tags and their content [OK]
Common Mistakes:
  • Thinking assert_select only checks tag presence without text
  • Confusing assert_response with assert_select
  • Assuming assert_select checks redirects
4. Identify the error in this integration test code:
test "create user" do
  post users_path, params: { user: { name: "Alice" } }
  assert_redirected_to user_path(@user)
end
medium
A. params hash syntax is invalid
B. Missing get request before post
C. Using @user without defining or assigning it in the test
D. Incorrect HTTP verb; should use get instead of post

Solution

  1. Step 1: Check variable usage in assertion

    The test asserts redirect to user_path(@user), but @user is never set.
  2. Step 2: Understand how to get created user

    After post, the created user should be fetched from controller or database, not assumed as @user.
  3. Final Answer:

    Using @user without defining or assigning it in the test -> Option C
  4. Quick Check:

    Undefined @user causes error in redirect assertion [OK]
Hint: Define variables before using in assertions [OK]
Common Mistakes:
  • Assuming @user is auto-set after post
  • Confusing HTTP verbs for create actions
  • Incorrect params hash structure
5. You want to write an integration test that submits a login form and then checks if the user is redirected to their dashboard page. Which sequence of methods correctly simulates this flow?
hard
A. post login_path, params: { session: { email: "user@example.com", password: "secret" } } followed by assert_redirected_to dashboard_path
B. get login_path followed by assert_response :success and then get dashboard_path
C. assert_redirected_to login_path followed by post dashboard_path
D. post dashboard_path with user params followed by assert_response :redirect

Solution

  1. Step 1: Identify correct HTTP verb for form submission

    Login forms usually submit with POST, so use post with params.
  2. Step 2: Check correct assertion after login

    After successful login, user should be redirected to dashboard, so assert_redirected_to dashboard_path is correct.
  3. Final Answer:

    post login_path, params: { session: { email: "user@example.com", password: "secret" } } followed by assert_redirected_to dashboard_path -> Option A
  4. Quick Check:

    POST login + assert redirect to dashboard [OK]
Hint: Use post for form submit, then assert_redirected_to for redirect [OK]
Common Mistakes:
  • Using get instead of post for form submission
  • Checking response success instead of redirect
  • Posting to dashboard_path instead of login_path
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard