Suffix

Published by Simon Schoeters

Sinatra, DataMapper and RSpec 2

Earlier today I was trying to get up to speed with Sinatra, DataMapper and RSpec. There is a great step by step tutorial for Sinatra and RSpec 1 if your need that, but I want to play with the shiny new stuff, so here we go.

Bundler

You don't have to use Bundler but it will make your (and your collaborators) gem dependencies so much easier. Start with creating a Gemfile in your project's root folder and add the gems you need.

source :rubygems

gem "sinatra"
gem "dm-sqlite-adapter"
gem "datamapper"

group :test do
  gem "rspec"
  gem "rack-test"
end

Now run bundle install (check the Bundler docs for installation instructions). This will install the gems specified above and create a Gemfile.lock file in the same directory.

RSpec

Let's configure RSpec. Create a spec directory in your project's root folder with a spec_helper.rb and myapp_spec.rb file (replace myapp with your app's name). Now, add the following to the spec_helper.rb file:

require File.join(File.dirname(__FILE__), '..', 'myapp.rb')

require 'rubygems'
require 'sinatra'
require 'rack/test'
require 'rspec'

set :environment, :test

Rspec.configure do |config|
  config.before(:each) { DataMapper.auto_migrate! }
end

The first line requires your Sinatra application (again, rename it with your application). The following lines require the stuff we need to run the tests and after that we set the environment. The last 3 lines reset the database before each test to make sure our tests don't influence one another.

Let's move on to the myapp_spec.rb:

require File.dirname(__FILE__) + '/spec_helper'

describe 'MyApp' do
  include Rack::Test::Methods

  def app
    Sinatra::Application
  end

  it 'should run a simple test' do
    get '/'
    last_response.status.should == 200
  end
end

This is where your tests go, how this works is not the scope of this tutorial. You can now run the test with RACK_ENV=test rspec . (that's a dot at the end).

Databases

If you don't specify another database it will use the same database for each environment. The data will be cleared each time. You can use the following snippet to use different database configurations per environment. Add this to your main application file.

DataMapper.setup(:default, "postgres://localhost/myapp")
configure :test do
  DataMapper.setup(:default, "sqlite::memory:")
end

That's all, happy testing everyone. :)