Skip to content

Instantly share code, notes, and snippets.

@przbadu
Last active August 22, 2017 02:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save przbadu/9d8dc4d4a011d7c5869ed15b4900aebe to your computer and use it in GitHub Desktop.
Save przbadu/9d8dc4d4a011d7c5869ed15b4900aebe to your computer and use it in GitHub Desktop.
Common configurations for rspec-rails, shoulda-matchers, factory_girl_rails and database_cleaner

Setting up Rspec

Add required gems to Gemfile

group :development, :test do
  gem 'rspec-rails', '~> 3.5'
  gem 'shoulda-matchers'
  gem 'factory_girl_rails'
  gem 'database_cleaner', '~> 1.6.0'
end

# code coverage
gem 'simplecov', :require => false, :group => :test

Now run bundle install to install newly added gems and generate rspec rails configuration with below command:

rails g rspec:install

it will generate 3 files for us

create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

Open spec/rails_helper.rb and uncomment below line to load all the files inside support directories. We can add all the configurations classes inside support directory and they will automatically loaded.

require 'simplecov'
SimpleCov.start 'rails'
.
.
.
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

Now that we are requiring all the files inside support directory, let's add support files to configure our requirements. Lets start by creating spec/support directory

mkdir -p spec/support

Now create spec/support/database_cleaner.rb file and add below codes in it

# spec/support/database_cleaner.rb

RSpec.configure do |config|
  config.before(:suite) { DatabaseCleaner.clean_with(:truncation) }
  config.before(:each) { DatabaseCleaner.strategy = :transaction }
  config.before(:each) { DatabaseCleaner.start }
  config.append_after(:each) { DatabaseCleaner.clean }
end

Create spec/support/factory_girl.rb and add below codes. With below configuration, we can use factory girls's create method directly without calling FactoryGirl e.g: create(:user, name: 'abc').

# spec/support/factory_girl.rb
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end

Create spec/support/shoulda_matchers.rb and add below codes

#spec/support/shoulda_mathers.rb
Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

Now, you can add your specs and everything should work:

For example:

# app/model/user.rb

class User < ActiveRecord::Base
  has_many :posts
  
  validates :email, presence: true
end

# spec/models/user_spec.rb

RSpec.describe User do
  it { should validate_presence_of :email }
  it { should have_many :posts }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment