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.