Rails RSpec Setup
Tags: rails, rspec, setup
Published: 2020-05-01 08:49:48

---
title: Rails RSpec Setup
published: true
description: In this article, you can read about how to set up Rails RSpec.
tags: rails, rspec, setup
---

RSpec is an awesome tool for testing Rails apps. It is a hugely popular  BDD-oriented (**B**ehavior **D**riven **D**evelopment) testing framework in the Ruby community.

It makes writing tests simpler, more expressive and easier to maintain!

## Getting started
First, you'll need to install RSpec but you’ll also need [Database Cleaner](https://github.com/DatabaseCleaner/database_cleaner) to help hold things together and ensure a clean state during tests. Add the following gems to the :test and :development groups in your [Gemfile](https://kolosek.com/rails-bundle-install-and-gemfile/) and then run `bundle install`:
```
group :development, :test do
  gem "database_cleaner"
  gem "rspec-rails"
end
```
It is very common to use RSpec together with [Capybara](https://kolosek.com/rails-capybara-setup/) to improve your testing development.
## Configuring RSpec
Before you can start with writing your RSpec tests your will need to run `rails generate rspec:install`. This will create the following files:
```
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```
Files such as, **spec_helper.rb** and **rails_helper.rb** contain the default RSpec set up with lots of comments. It is *strongly* recommended to read through all of those comments to get a good understanding of what each option does.
###spec_helper.rb
spec_helper.rb file is used to configure RSpec. The base configuration file, after uncommenting some useful configuration options, is written in the following way:
```
RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups
  config.filter_run_when_matching :focus
  config.disable_monkey_patching!
  
  if config.files_to_run.one?
    config.default_formatter = "doc"
  end
  
  config.profile_examples = 10
  
  config.order = :random
  Kernel.srand config.seed
end
```
* `expectations.include_chain_clauses_in_custom_matcher_descriptions = true` - [Chain method](https://relishapp.com/rspec/rspec-expectations/docs/custom-matchers/define-matcher-with-fluent-interface) allows custom matcher descriptions and failure messages to include text for helper methods.
* `mocks.verify_partial_doubles = true` - [Partial doubles](http://relishapp.com/rspec/rspec-mocks/docs/verifying-doubles/partial-doubles) prevent you from stubbing any methods that don’t already exist on an object, it typo-proofs your mocks.
* `config.shared_context_metadata_behavior = :apply_to_host_groups` - [Shared context metadata](http://www.rubydoc.info/github/rspec/rspec-core/RSpec%2FCore%2FConfiguration%3Ashared_context_metadata_behavior) configures how RSpec treats metadata passed as part of a shared example group definition.
* `filter_run_when_matching` - [Filter run when matching](https://relishapp.com/rspec/rspec-core/docs/filtering/filter-run-when-matching) allows you to limit a spec run to individual examples or groups you tagged with `:focus` metadata.
* `disable_monkey_patching!` - [Prevents RSpec from monkey patching](https://relishapp.com/rspec/rspec-core/v/3-5/docs/configuration/zero-monkey-patching-mode) makes objects behave in tests as they would in "real" life.
* `default_formatter` - [Default formatter](https://relishapp.com/rspec/rspec-core/v/2-5/docs/command-line/format-option) sets up the default format of your rspec tests that will be used if no formatter has been set.
* `config.profile_examples` - [Profile examples](https://relishapp.com/rspec/rspec-core/docs/configuration/profile-examples) print the slowest examples and example groups at the end of the spec run, but it slows down your suite
* `config.order = :random` and `Kernel.srand config.seed` - Configure tests to run in a [random order](https://relishapp.com/rspec/rspec-core/v/3-5/docs/command-line/order). This helps to keep each test independent of one another. 
### rails_helper.rb
rails_helper.rb file is used for specs which depend on Rails (mostly model and [controller tests](https://kolosek.com/rspec-controller-test/), but also on nearly every part of a Rails projects). 
==rails_helper.rb requires spec_helper.rb to work.==
```
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end
```
* `fixture_path` - [File fixture](https://relishapp.com/rspec/rspec-rails/v/3-5/docs/file-fixture) is a normal file stored in spec/fixtures by default.
* `use_transactional_fixtures` - [Transactional](https://relishapp.com/rspec/rspec-rails/docs/transactions) fixtures allow records created for one test to be visible for the next test.
* `infer_spec_type_from_file_location!` -  Allows to automatically [tag specs in directories](https://relishapp.com/rspec/rspec-rails/docs/directory-structure) with matching type metadata so that they have relevant helpers available to them.
* `filter_rails_from_backtrace!` - [Backtrace filtering](https://relishapp.com/rspec/rspec-rails/docs/backtrace-filtering) is used to filter out lines in backtraces that come from Rails gems in order to reduce the noise in test failure output.
##Configuring Database Cleaner
By configuring the **Database Cleaner** in your application, you make it sure that tests start with a clean state. The only thing you need to do is to add the following to your RSpec.configure block in rails_helper.rb:
```
config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
end
```
## How to run the tests?
Once everything is configured you are ready to go! There are four ways to run your test:
* Everything at once: `bundle exec rspec`. 
This runs all your tests.
* One RSpec package: `bundle exec rspec ./spec/models`
This runs all model specs.
* One RSpec file at a time: `bundle exec rspec ./spec/models/story_spec.rb`. 
This runs only tests in Story model.
* One by one: `bundle exec rspec ./spec/models/story_spec.rb:10`
This runs only tests on line 10 in Story model.

In the same way, you can run tests on your [controller](https://kolosek.com/rspec-controller-test/).

Be careful! The more tests there are the longer it takes to compile them. Only run tests for what you really need!

*Originally published at [Kolosek blog](kolosek.com/rails-rspec-setup/).*