assert-response: sugar around Rack::Test ================================================================================================= When it comes to **Rack::Test** there are two things that I don't like: * If your rack app raises an error, it is not exposed as an error but hidden in last_response.errors * Most of the time a status 404 should be considered as an error - the only exeption being that we expect a 404 status * It's annoying to test for content-types **assert-response** is there to address these issues: * an error that occurs in your rack app will be raised (with original backtrace) * you may test the error class and message * a status 404 will raise an error everywhere execept from testing 404 responses * you get a shortcut for all content-types that come with Rack::Mime and may register your own * you get a little DSL to be able to do several test against the same response in a DRY way Installation ------------ _assert-response_ has been tested with _ruby 1.8.7_ and _1.9.2._ It should be usable with every testing library and has been tested with _test/unit_ and _minitest_. Install it as a gem: sudo gem install assert-response or in rvm: gem install assert-response Examples -------- require 'minitest' require 'rack/test' require 'assert-reponse' include Rack::Test::Methods def app MyApp end _(for usage without the inclusion of Rack::Test::Methods or with Test::Unit, see AssertResponse::Methods)_ And then in your test something like this: get '/myroute' assert_response_html 'my body' This will # raise the error, if an error occures in MyApp raise AssertResponse::Status404 if last_response.status is not 404 assert_equal200, last_response.status assert "test/html", last_response.headers['Content-Type'] assert_match /my\ body/, last_response.body But you may also want to... check just the mime type: get '/myroute' assert_response_is_html check for a 404 page: get '/myroute' assert_response_not_found_html "Not found!" This one does: assert 404, last_response.status assert "test/html", last_response.headers['Content-Type'] assert_match /Not\ found!/, last_response.body For all mime types in Rack::Mime you get 3 methods, where [shortcut] is the file extension assert_response_[shortcut] # checks for status 200, content-type and body matching assert_response_is_[shortcut] # checks for content-type and status 200 assert_response_not_found_[shortcut] # checks for content-type, status 404 and body matching You may define your own content-type with AssertResponse.add_content_type :my_shortcut, "text/mymimetype" # later... assert_response_my_shortcut "here the body" assert_response_is_my_shortcut assert_response_not_found_my_shortcut "Not found but correct content-type" There is some additional sugar like assert_response_redirect assert_response_raises assert_response_body assert_response_header assert_response_not_found assert_response_ok Everything after _assert\_response\__ is the called method of _AssertResponse_, look them up in the documentation. When using the _assert\_response\__ methods always the the *last_response* object is checked. If you want to check a saved response instead, you may use the little DSL get '/myroute' my_response = last_response get '/other' assert_response my_response do is_html # checks content-type body 'my body' # same as 'body /my\ body/' end Now inside the code block you may use the methods of _AssertResponse_ (but without the *assert\_response\_* prefixes). Contributing to assert-response ------------------------------- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it * Fork the project * Start a feature/bugfix branch * Commit and push until you are happy with your contribution * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally. * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it. Copyright --------- Copyright (c) 2011 Marc Rene Arns. See LICENSE.txt for further details.