Integrate RSpec for Behavioral Driven Development
Learn how to integrate RSpec for a Ruby on Rails microservice application, including some key configuration options for test database management.
Guide Tasks
  • Read Tutorial

If you're taking an advanced Rails course you probably already know how to install RSpec for Behavioral Driven Development (BDD), however we'll go through it in case it's new to it or you want a resource with clear instructions. You can also reference my rspec-rails gem tutorial at anytime.

The first thing to do will be to install the gem, update the :development, :test block in the Gemfile and add in the following gems

# Gemfile

group :development, :test do
  gem 'rspec-rails', '~> 3.4', '>= 3.4.2'
  gem 'factory_girl_rails'
  gem 'capybara'
  gem 'database_cleaner'
end

In addition to rspec-rails I'm also integrating:

  • factory_girl_rails - for creating test data objects

  • capybara - for creating integration tests

  • database_cleaner - for cleaning out the database and prevent data conflicts

After running bundle we can run the RSpec generator:

rails generate rspec:install

This will give us our test files and integrate RSpec so that it automatically creates specs for our models and controllers when we run rails generators. Now let's customize our rails_helper file, I've removed all of the comments and added in calls for capybara and integrated the database cleaning processes:

# spec/rails_helper.rb

ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = false
  config.before(:suite) { DatabaseCleaner.clean_with(:truncation) }
  config.before(:each) { DatabaseCleaner.strategy = :transaction }
  config.before(:each, :js => true) { DatabaseCleaner.strategy = :truncation }
  config.before(:each) { DatabaseCleaner.start }
  config.after(:each) { DatabaseCleaner.clean }
  config.infer_spec_type_from_file_location!
end

That's all that we have to do, let's create our resource to ensure that everything is working properly.

Creating a Microservice Model with BDD

Run the following resources generator in the terminal, you can reference the application requirements to review the attributes that we'll need to have:

rails g resource Notification phone:string body:text source_app:string

Running this will create all Notification files, including the: Model and Controller files:

MacBook-Pro-3:message_service admin$ rails g resource Notification phone:string, body:text, source_app:string
Running via Spring preloader in process 49023
      invoke  active_record
      create    db/migrate/20160212022834_create_notifications.rb
      create    app/models/notification.rb
      invoke    rspec
      create      spec/models/notification_spec.rb
      invoke      factory_girl
      create        spec/factories/notifications.rb
      invoke  controller
      create    app/controllers/notifications_controller.rb
      invoke    erb
      create      app/views/notifications
      invoke    rspec
      create      spec/controllers/notifications_controller_spec.rb
      invoke    helper
      create      app/helpers/notifications_helper.rb
      invoke      rspec
      create        spec/helpers/notifications_helper_spec.rb
      invoke    assets
      invoke      coffee
      create        app/assets/javascripts/notifications.coffee
      invoke      scss
      create        app/assets/stylesheets/notifications.scss
      invoke  resource_route
       route    resources :notifications

Notice how it also created a number of 'spec' files? That means that our RSpec integration is working and automatically creating spec files for us to use.

Run rake db:migrate to update the schema file and we'll be ready to create our first spec.

Open up the notification model spec and update it with a basic test:

# spec/models/notification.rb

require 'rails_helper'

RSpec.describe Notification, type: :model do
  describe 'creation' do
    it 'can be created' do
      notification = Notification.create(phone: "555-555-5555", body: "My message", source_app: "some_app")
      expect(notification).to be_valid
    end
  end
end

This is a very basic test that ensures that RSpec is working by checking to see if a Notification can be created. Running rspec in the terminal will run the spec and it looks like everything is working! Nice work, we have our test suite ready to go and now we can start building out our microservice.

Resources