Techdots
Blog
Testing Ruby on Rails Applications with RSpec and Capybara
Learn the essentials of Rails testing with RSpec and Capybara, tools that help you catch bugs early, boost code quality, and ensure app reliability.

Testing is a critical part of developing reliable Ruby on Rails applications. One of the most effective tools for Rails testing is RSpec, a robust testing framework that helps you write clear, maintainable tests. Paired with Capybara, you can easily perform integration testing to simulate user interactions and ensure your app behaves as expected. 

This blog will explain the essentials of Rails testing with RSpec and how Capybara integration testing can help you catch bugs early, improve code quality, and boost confidence in your application’s functionality.

Importance of Testing in Rails Applications

Testing is essential in any Rails application. It preserves high-quality code, guards against regressions, and guarantees stability. Testing is another way to find flaws early on, particularly when reworking or introducing new functionality. Executing your Rails tests ensures your code maintains the intended functionality even after significant code reorganization.

You may test your application's response without using your browser using Rails tests, which can also imitate browser queries.

Types of Testing

Testing on Rails can be one of the following:

  • Unit Tests: Focus on small, isolated parts of your code (e.g., models and methods).
  • Integration Tests: Verify that different parts of your application work together.
  • System Tests: Simulate real user interactions, ensuring the app works from the user's perspective.

Test-Driven Development (TDD) in Rails

TDD in Rails emphasizes writing tests before writing the actual code. This leads to fewer bugs, cleaner design, and improved confidence when changing code. Scroll down to learn Rails testing with RSpec and Capybara system testing. 

Setting Up RSpec and Capybara

Step I: Add RSpec and Capybara to the Gemfile

Open your Gemfile and add the following code under the :development, :test group:

group :development, :test do

  gem 'rspec-rails', '~> 5.0'

  gem 'capybara', '>= 3.26'

  gem 'selenium-webdriver'

  gem 'webdrivers'

end

Step II: Run the Install Commands

The next step in Rails testing with RSpec is to install the gems by running:

bundle install

Step III: Initialize RSpec in Your Project

Then, run the following command to generate RSpec files:

rails generate rspec:install

This creates the necessary RSpec files, including spec/spec_helper.rb and spec/rails_helper.rb.

Step IV: Configure Capybara

In spec/rails_helper.rb, add the following configuration to enable Capybara:

require 'capybara/rails'

Capybara is now set up and ready to test system features.

Creating a Task Model and Controller for Testing

After setting up, the next step is RSpec unit testing. Follow these steps for testing RSpec:

Step 1: Generate Task Model

We’ll create a simple Task model with title and description:

rails generate model Task title:string description:text

Step 2: Migrate the Database

Run the migration to apply the changes:

rails db:migrate

Step 3: Generate a Tasks Controller

Now generate a controller to handle Task actions:

rails generate controller Tasks index

 Add basic routing to config/routes.rb:

Rails.application.routes.draw do

  resources :tasks

end

 

In app/controllers/tasks_controller.rb, add an action to fetch and display tasks:

class TasksController < ApplicationController

  def index

    @tasks = Task.all

  end

end

 

In app/views/tasks/index.html.erb, display the tasks:

<h1>Tasks</h1>

<ul>

  <% @tasks.each do |task| %>

    <li><%= task.title %>: <%= task.description %></li>

  <% end %>

</ul>

Writing Unit Tests with RSpec

Step 1: Testing the Task Model

We’ll write some basic unit tests to ensure that the Task model works correctly.

Create a new file: spec/models/task_spec.rb and add the following:

require 'rails_helper'

 

RSpec.describe Task, type: :model do

  it 'is valid with a title and description' do

    task = Task.new(title: 'Test Task', description: 'A simple task description')

    expect(task).to be_valid

  end

 

  it 'is invalid without a title' do

    task = Task.new(title: nil)

    expect(task).not_to be_valid

  end

end

Step 2: Run the Unit Tests

To run your RSpec tests:

bundle exec rspec

 

If everything is set up correctly, your tests should pass successfully.

Writing Integration Tests with Capybara

Capybara allows us to simulate user interactions on web pages. Follow these steps for Capybara integration testing:

Step 1: Set Up Capybara for System Tests

Add the following to the bottom of spec/rails_helper.rb:

Capybara.default_driver = :selenium_chrome

 

Step 2: Write a Feature Test

We will write a test to check if tasks are displayed on the page.

Create a new file: spec/features/task_management_spec.rb:

require 'rails_helper'

 

RSpec.describe 'Task Management', type: :feature do

  scenario 'User views task list' do

    Task.create!(title: 'Task 1', description: 'First task description')

 

    visit tasks_path

 

    expect(page).to have_content('Task 1')

    expect(page).to have_content('First task description')

  end

end

 

Step 3: Run the Feature Test

Run the feature test with:

bundle exec rspec

Capybara will launch a browser, simulate the user interaction, and verify the tasks.

Continuous Integration (CI) Setup: How to Automate Tests in CI/CD Pipelines

Rails CI/CD testing is necessary. So, first, set up GitHub Actions for CI/CD testing. Create a .github/workflows/ci.yml file:

name: CI setup

 

on:

 push:

   branches:

     - main

 pull_request:

   branches:

     - main

 

jobs:

 test:

   runs-on: ubuntu-latest

 

   services:

     db:

       image: mysql:5.7

       ports:

         - 3306:3306

   steps:

     - name: Checkout code

       uses: actions/checkout@v3

 

     - name: Set up Ruby

       uses: ruby/setup-ruby@v1

       with:

         ruby-version: 3.2.2

         bundler-cache: true

 

     - name: Install dependencies

       run: |

         bundle install

 

     - name: Run RSpec tests

       run: |

         bundle exec rspec

This script sets up CI to automatically run your tests every time you push changes to the main branch or create a pull request.

Key Takeaways

Employing Rails testing with RSpec and Capybara integration testing can make your Ruby on Rails application dependable, user-friendly, and free of key flaws. Adhering to these testing guidelines can increase your confidence in every deployment while simultaneously maintaining smooth functionality as your software expands.

Keep Tests Updated: Regularly refactor and update tests as the app evolves.

Aim for High Coverage: Focus on testing critical paths, not just numbers.

Automate Testing: Use CI pipelines (e.g., GitHub Actions) to run tests automatically with every commit.

Testing is essential to building robust Rails applications, and with RSpec and Capybara, you can ensure your code works as expected at every stage of development.

Contact
Us
Our Technology Stack

Work with future-proof technologies

Typescript
React JS
Node JS
Angular
Vue JS
Rails
Ruby on Rails
Go
Next JS
AWS
SASS