Sinatra::Tests
A Sinatra extension and repository of common RSpec helpers when testing your Sinatra apps/gems.
Installation
# Add Gemcutter to your RubyGems sources
$ gem sources -a http://gemcutter.com
$ (sudo)? gem install sinatra-tests
Dependencies
This Gem depends upon the following:
-
sinatra ( >= 0.10.1 )
-
rspec (>= 1.3.0 )
-
rack-test (>= 0.5.3)
-
rspec_hpricot_matchers (>= 0.1.0)
Getting Started
Step 1
In your spec/spec_helper.rb file add the following:
require 'sinatra/tests'
By just requiring that gem, you essentially get all of this:
require 'sinatra/base'
require 'test/unit'
require 'rack/test'
require 'spec'
require 'spec/interop/test'
require 'rspec_hpricot_matchers'
and a few other goodies.
Step 2
Declare the following Spec block:
Spec::Runner.configure do |config|
config.include RspecHpricotMatchers
config.include Sinatra::Tests::TestCase
config.include Sinatra::Tests::RSpec::SharedSpecs
end
Step 3
In your TestApp block, register the Sinatra::Tests extension, by adding the following:
class MyTestApp < Sinatra::Base
register(Sinatra::Tests)
<snip...>
end
Step 4
And finally define the TestCase block like this:
class Test::Unit::TestCase
Sinatra::Base.set :environment, :test
end
That’s all. Now onto the niceties this provides you.
USAGE
RSpec Matchers
:be_even
A simple matcher that tests for an even number
1.should_not be_even
2.should be_even
:have_a_page_title(:title_text)
A simple matcher that tests for a <head> with a <title> tag with the given text.
body.should have_a_page_title("Home | Site Title")
body.should have_a_page_title(/Home/)
:have_a_page_header(:text, :tag)
A simple matcher that tests for <h(1..6)> header tag with the given text.
NB! Throws an Exception when there’s more than one page header on the page.
body.should have_a_page_header('Page Header')
body.should have_a_page_header(/Contact Information/, 'h1')
body.should have_a_page_header(/Contact Information/, 'body > h1')
:have_a_ui_btn(:tag, :action, :model_name_singluar, :link_text)
A simple matcher that tests for a <a href>
tag with class ‘ui-btn :action-link’ and a number of other specific values, derived from the other arguments passed.
body.should have_a_ui_btn('div', :edit, :article, 'Edit')
=> expects <a href="/articles/:id/edit" class="ui-btn edit-link" title="edit article">Edit</a>
body.should have_a_ui_btn('div', :delete, :article) =>
=> expects <a href="/articles/:id" class="ui-btn delete-link" title="delete article">DELETE</a>
:have_an_edit_btn(:tag, :model_name_singluar)
A simple matcher that tests for a <a href>
tag with class ‘ui-btn edit-link’
body.should have_an_edit_btn('td.actions', :post)
body.should have_an_edit_btn('td.actions', :post, 'Custom Btn Text')
:have_a_delete_btn(:tag, :model_name_singluar)
A simple matcher that tests for a <a href>
tag with class ‘ui-btn delete-link’
body.should have_a_delete_btn('td.actions', :post)
body.should have_a_delete_btn('td.actions', :post, 'Custom Btn Text')
:have_a_show_btn(:tag, :model_name_singluar)
A simple matcher that tests for a <a href>
tag with class ‘ui-btn show-link’
body.should have_a_show_btn('td.actions', :post)
body.should have_a_show_btn('td.actions', :post, 'Custom Btn Text')
RSpec SharedSpecs
These are just some of the shared specs that I have been using, but they are being changed at the moment, so no guarantees of them surviving or remaining in their current form / functionality.
DEBUG
Dump a list of methods for the current app
it_should_behave_like "debug => app.methods"
Tests the body output for a <debug>
tag, ie: prints out the entire body content
it_should_behave_like "debug"
RESPONSE
Checks that we got a 200 status (OK), and content-type is text/html
it_should_behave_like "HTTP headers"
it_should_behave_like "HTML"
Checks that we got a 200 status (OK), and content-type is text/css
it_should_behave_like "CSS"
HTML OUTPUT
Checks that the page has a <div id="main-content"></div>
it_should_behave_like "div#main-content"
Checks that the page has an <h2>
tag within the <div id="main-content"></div>
it_should_behave_like "div#main-content > h2"
More to be addded later…
FORMS
Checks that the page has a form with a <input type="hidden"...>
tag.
it_should_behave_like "forms > faux method > input.hidden"
More to be addded later…
RTFM
For a better understanding of this Gem, make sure you study the ‘sinatra-tests/spec/*_spec.rb
’ files.
Errors / Bugs
If something is not behaving intuitively, it is a bug, and should be reported. Report it here: github.com/kematzy/sinatra-tests/issues
TODOs
-
Add more tests to various matchers.
-
Create a test suite for the Shared Specs.
-
Add Test::Unit (assert*) matchers and shared tests. (Please fork and add if you want this!)
Note on Patches/Pull Requests
-
Fork the project.
-
Make your feature addition or bug fix.
-
Add tests for it. This is important so I don’t break it in a future version unintentionally.
-
Commit, do not mess with rakefile, version, or history.
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
-
-
Send me a pull request. Bonus points for topic branches.
Credits
Copyright © 2009 Kematzy [ kematzy gmail com ]
Licence
Released under the MIT license.