__ __ ______
/ / / /_ _________________/ ____/________________
/ /_/ / / / / __ \ _ \_ __/____ \/ __ \ _ \ ___/
/ __ / /_/ / /_/ / __/ / ____/ / /_/ / __/ /__
/_/ /_/\__, / ____/\___/_/ /_____/ ____/\___/\___/
/____/_/ /_/
A full stack testing framework for HTTP APIs.
By extending minitest/spec HyperSpec provides a Ruby DSL for testing
HTTP APIs from the outside.
Example
#source: examples/readme/service_spec.rb
service "http://localhost:4567" do
def responds_with_json_where
JSON.parse(response.body)
end
resource "/lolz" do
get do
it { responds_with.status :ok }
it { responds_with_json_where['lolz'].must_be_instance_of Array }
with_query("q=monorail") do
it "only lists lolz that match the query" do
responds_with_json_where['lolz'].wont_be_empty
responds_with_json_where['lolz'].each do |lol|
lol['title'].must_match /monorail/
end
end
end
with_query("q=looong") do
it "only lists lolz that match the query" do
responds_with_json_where['lolz'].wont_be_empty
responds_with_json_where['lolz'].each do |lol|
lol['title'].must_match /looong/
end
end
end
end
post do
describe "without request body" do
it { responds_with.status :unprocessable_entity }
end
describe "with request body" do
with_headers({ 'Content-Type' => 'application/json' }) do
with_request_body({ "title" => "Roflcopter!" }.to_json) do
it { responds_with.status :created }
it do
responds_with_json_where['lol']['title'].
must_equal 'Roflcopter!'
end
end
end
end
end
end
endConcepts
service
Sets the BASE_URI of the API.
resource
Sets the URI under test. Absolute or relative to the current scope.
get, head, post, put and delete
Selects the HTTP method for the request.
with_query
Sets the query component of a request. Overrides previously set parameters.
with_headers
Sets the headers of a request. Merges with previously set headers.
with_body
Sets the body of a request. Overrides previously set parameters.
response
An object for accessing properties of the "raw" response.
responds_with
Issues the request and returns an object that has the following convenience matchers:
status
Allows for comparing against named status code symbols.
content_type
content_charset
Upcoming features
Representations
- DSL for matching representations.
Documentation
- Adding an output format for docs.
Concerns
- Efficient ways of building up and verifying precondition state.
- Verify an eventual consistent state.
- Allowing whitebox testing by "wormholing" into the application(s).
Acknowledgments
Thanks to:
-
Daniel Bornkessel for inspiring me to do
READMEdriven development. - Matthias Georgi for suggestions for code improvements.
- Lars Gierth for updating the example server to respond with 415 Unsupported Media Type in the appropriate case.
- Anton Lindqvist for adding HTTP Basic Auth
-
Josh Devins for noticing missing HTTP status codes and
with_querydocumentation inconsistency.
History
0.0.5 - 2012-12-04
- Change dependency declaration.
0.0.4 - 2012-11-22
- Change behavior of
with_queryto override instead of append.
0.0.3 - 2012-08-10
- Add complete list of HTTP response codes.
0.0.2 - 2012-03-30
- Correcting environment dependencies.
- Adding support for HTTP Basic Auth.
0.0.1 - 2012-02-07
- Initial release