== API ==== Given steps "Given a model exists", e.g. Given a user exists Given a user: "fred" exists Given the user exists "Given a model exists with fields", e.g. Given a user exists with name: "Fred" Given a user exists with name: "Fred", activated: false You can refer to other models in the fields Given a user exists And a post exists with author: the user Given a person: "fred" exists And a person: "ethel" exists And a fatherhood exists with parent: user "fred", child: user "ethel" "Given n models exist", e.g. Given 10 users exist "Given n models exist with fields", examples: Given 10 users exist with activated: false "Given the following models exist:", examples: Given the following users exist | name | activated | | Fred | false | | Ethel | true | ==== Then steps ===== Asserting existence of models "Then a model should exist", e.g. Then a user should exist "Then a model should exist with fields", e.g. Then a user: "fred" should exist with name: "Fred" # we can label the found user for later use You can use other models, booleans, numerics, and strings as fields Then a person should exist with child: person "ethel" Then a user should exist with activated: false Then a user should exist with activated: true, email: "fred@gmail.com" "Then n models should exist", e.g. Then 10 events should exist "Then n models should exist with fields", e.g. Then 2 people should exist with father: person "fred" "Then the following models exist". This allows the creation of multiple models using a table syntax. Using a column with the singularized name of the model creates a referenceable model. E.g. Then the following users exist: | name | activated | | Freddy | false | Then the following users exist: | user | name | activated | | Fred | Freddy | false | ===== Asserting associations One-to-one assocs: "Then a model should be other model's association", e.g. Then the person: "fred" should be person: "ethel"'s father Many-to-one assocs: "Then a model should be [in|one of] other model's association", e.g. Then the person: "ethel" should be one of person: "fred"'s children Then the comment should be in the post's comments ===== Asserting predicate methods "Then a model should [be|have] [a|an] predicate", e.g. Then the user should have a status # => user.status.should be_present Then the user should have a stale password # => user.should have_stale_password Then the car: "batmobile" should be fast # => car.should be_fast "Then a model should not [be|have] [a|an] predicate", e.g. Then person: "fred" should not be childless # => fred.should_not be_childless === Regexps for use in your own steps By default you get some regexps available in the main namespace for use in creating your own steps: `capture_model`, `capture_fields`, and others (see lib/pickle.rb) (You can use any of the regexps that Pickle uses by using the Pickle.parser namespace, see Pickle::Parser::Matchers for the methods available) *capture_model* Given /^#{capture_model} exists$/ do |model_name| model(model_name).should_not == nil end Then /^I should be at the (.*?) page$/ |page| if page =~ /#{capture_model}'s/ url_for(model($1)) else # ... end end Then /^#{capture_model} should be one of #{capture_model}'s posts$/ do |post, forum| post = model!(post) forum = model!(forum) forum.posts.should include(post) end *capture_fields* This is useful for setting attributes, and knows about pickle model names so that you can build up composite objects with ease Given /^#{capture_model} exists with #{capture_fields}$/ do |model_name, fields| create_model(model_name, fields) end # example of use Given a user exists And a post exists with author: the user # this step will assign the above user as :author on the post