Here’s a cheat sheet on rSpec with almost completely raw formatting… I’ll HTMLify it if anyone’s interested.
describe X {block} and describe X, ".y" {block}: in {block}, describe the behavior of class X (or its y method)
it("description") {block}: in {block}, use matchers to define expectations.
before, before(:each), before(:all): set up before each test or before all tests
Matchers:
Use .should_not for negatives
target.should be_x: method x? should return true
target.should be_close(x, margin): target number should be within margin of x
target.should be_an_instance_of(X): should be of class X or a subclass
target.should have(x).y, target.should have_at_least(x).y, target.should have_at_most(x).y: method y should return array of (at least/most) length x
target.should match(/x/): regexp matching
target.should raise_error(x): should throw Exception of (optional) type X
target.should respond_to(x): should respond to message x (auto-converts strings to symbols)
target.should satisfy {block}: yields target to {block}, passes if {block} returns true
Custom matchers:
Define a new class with the below methods:
initialize():
matches?(target): returns true if target matches, false otherwise
failure_message: returns "expected x but got y" string to be displayed upon failure
negative_failure_message: returns "expected x to not be y" string to be displayed upon failure of should_not clause
Define a method in the current module that instantiates the new class. This is the method target.should will call.
Mocks:
.should_receive(:x): test fails if method x is never called
{block}: can provide {block} and use matchers to set expectations for arguments
.and_return(y): returns value y when mock method is called
.and_raise(y): raises exception y when called
.and_yield(values): yields values when called
.and_yield clauses can be chained to yield different values on subsequent call
.with(x, y): test fails if method is never called with arguments x and y
Can use these in place of specific arguments:
:no_args
:any_args
:numeric, :boolean, :string
/pattern/
:anything
ducktype(:x, :y): argument should respond to x and y
Method call counts:
.once, .twice, .exactly(n).times
.at_least(n).times
.at_most(n).times
.any_number_of_times
.ordered: method will be added to list of methods expected to be called in order
.stub!(:x): like should_recieve, but does not fail if never called
User Stories:
Plain text format:
Begins with "Story: [title]"
Business case:
As a [role]: Who user is (user, admin, etc.)
I want to [perform action]: login, set permissions, etc.
So that [business value]: "I can get access to the site", "I can sell my goods", etc.
Scenarios:
Begin with "Scenario: [description]"
'Given' clauses: set up for use case
Given a user 'jdoe'
And a document 'noname.txt'
'When' clauses: show action
When the user is logged in
And the user reads the file
'Then' clauses: show expectations
Then the file's contents should be returned
Story steps:
steps_for(:category) {block}: Define given, when, and then blocks within {block}
Given "string with match $marker(s)" {|marker| block}
Matches 'Given' clauses in plain-text story (or And clauses that follow Given)
Word in plain-text story that matches $marker will be passed to {block}
Can also use regexp with capture groups in place of match string
Within {block}, use rSpec or other Ruby code to set up for test
When "string with match $marker(s)" {|marker| block}
Same as Given, but matches When (or subsequent And) clauses
Within {block}, perform actions
Then "string with match $marker(s)" {|marker| block}
Same as Given, but matches Then (or subsequent And) clauses
Within {block}, define expectations
with_steps_for(:category) {block}
Reference :category set up by earlier steps_for() call.
run(text_file, options): Run plain text story in text_file with given steps