• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Rspec 101
 

Rspec 101

on

  • 5,154 views

Intro to RSpec methods

Intro to RSpec methods

Statistics

Views

Total Views
5,154
Views on SlideShare
5,152
Embed Views
2

Actions

Likes
4
Downloads
44
Comments
0

2 Embeds 2

http://duckduckgo.com 1
http://www.docshut.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Thebe_XXXX test works only if the item you called should on has a XXXX? method.
  • If the should method doesn’t have an explicit receiver, it will delegate to the declared subject.Read your tests out loud to make sure they sound right. “Specify the subject should be eligible to vote” vs “it should be eligible to vote”.
  • should_receive will error if :name is not calledstub will not error if :occupation is not called

Rspec 101 Rspec 101 Presentation Transcript

  • Rspec 101
    Jason Noble
    http://jasonnoble.org
  • Example Group
    describe()
    Defines example group of tests
    String we pass describes the item we’re testing
    it()
    Defines a code example
    String we pass describes the specific behaviour
  • describe() Method
    describe “A User” {…}
    A User
    describe User {…}
    User
    describe User, “with no roles assigned” {…}
    User with no roles assigned
  • Describe blocks can be nested
  • context() method
    context() is an alias for describe()
    Use describe() for things, context() for context
  • it() method
    Argument should state what is being tested
  • Pending tests
    We can mark tests to be implemented “later”
  • Pending tests (cont.)
    Each method of marking a test as pending has its usefulness:
    Add pending examples as you think of stuff to test
    Disable failing examples without losing track that you need to fix those at some point
    Wrap failing examples when you want to be notified when changes to the system cause them to pass (bug is fixed, etc)
  • before()/after() method
    Before/after methods helps you set and/or reset initial state
    Create a new stack, add one element to it
    Takes one argument
    :each
    Executes this block before each test group executes
    :all
    Executes this block once for all tests before the first test is run
  • before(:each) method
  • before(:all)
    Method is run once and only once for a group of tests
    Be careful using this method, usually we want each test to have it’s own environment setup
    Sharing state between examples can cause unexpected things
    Good examples:
    Opening a network connection
    Pre-seeding caches
  • after(:each) method
    Code is ran after each example
    Rarely necessary because each example runs in its own scope, and consequently the instance variables in that scope are reset
    Can be useful to reset global state of things after your test completes
    after(:each) is guaranteed to run after each example, even if failure or errors are raised
  • after(:each) example
  • after(:all) method
    This is even more rare than the after(:each)
    Examples:
    Close down browsers
    Close database connections
    Close sockets
    Any resource we want to release when we’re done, but not after every individual test
  • around(:each) method
    Supports APIs that require a block
    Very rarely, if ever used
    I have never used this
    Put your functionality into before/after blocks if at all possible
    See http://relishapp.com/rspec/rspec-core/v/2-0/dir/hooks/around-hooks if you’re interested
  • Helper Methods
    Defined within an example group
    Available to all examples in the group
  • Shared Helper Methods
    If helper methods need to be used across example groups, put them in one or more modules and include modules in example groups we want to have access
  • Shared Examples
    If we expect instances of more than one class to behave in the same way, a shared example group describes the behavior once and includes it in multiple example groups
  • Shared examples (cont.)
  • RSpec::Expectations
    One goal of BDD is getting the words right
    Expectations vs. Assertions
    We are setting an expectation of what should happen rather than what will happen
    In fact the word should is part of RSpec
    result.should equal(5)
    message.should match(/on Sunday/)
  • should, should_not and matchers
    result.should equal(5)
    If result is equal to 5, it passes
    result.should_not equal(5)
    If result is anything other than 5, it passes
    General Pattern:result.should ________(value)
    _______ is a matcher
  • RSpec built in Matchers
    include(item)
    prime_numbers.should_not include(8)
    respond_to(message)
    list.shouldrespond_to(:length)
    raise_error(type)
    lambda { Object.new.explode! }.should raise_error(NameError)
  • 4 ways to be equal
    a == b
    Value equality (Most common)
    a === b
    Is Object a the same Object as b
    a.eql?(b)
    Are a and b values equal and of same type
    a.equal?(b)
    Is Object a the same Object as b
    (General Rule: The longer the method name, the more restrictive the matcher is)
  • Do not use != in expectations
    actual.should != expected
    action.should_not == expected
    Causes issues, explained in detail in the RSpec book
  • Floating Point Calculations
    “expected 5.25 got 5.251” is frustrating in a failure message
    RSpec offers a be_close matcher that accepts an expected value and an acceptable delta
    result.shouldbe_close(5.25, 0.005)
    Will pass as long as result is within .005 of 5.25
  • Matching Text
    response.should match(/this expression/)
    Matches if response has text “this expression” somewhere in its contents
    response.should =~ /this expression/
    Functionally equivalent to the previous one
  • Expect{}
    Tests that a block of code causes some effect
    You can also use .to(1) or .from(0).to(1)
  • Predicate Matchers
    How do we test array.empty?
    array.empty?.should == true
    array.shouldbe_empty
  • Predicate matchers (cont.)
    RSpec gives you other options
    be_
    be_a
    ted.shouldbe_a_kind_of(Player) => ted.kind_of?(Player)
    be_an
    ted.shouldbe_an_instance_of(Player) =>ted.instance_of?(Player)
    RSpec also lets you write your own matchers
  • Matchers
    have_ becomes has_
    request_params.shouldhave_key(:id) =>request_params.has_key?(:id).should == true
  • specify{}
    Sometimes RSpec can guess your tests
    it “should have 32 pieces” do @board.should have(32).piecesend
    specify { @board.should have(32).pieces }
    This is used rarely (very simple tests)
  • subject {}
    Clean up your tests by specifying a subject
  • RSpec Mocks
    Mocks allow you to fake functionality that isn’t being tested. See the book for more info.
  • rspec command
    rspec –help
    List options available to running RSpec
    rspec spec/simple_math_spec.rb
    Run only one spec file
    rspec spec
    Run all specs in spec/ directory
    rspec spec --format documentation
    Makes RSpec more verbose with test output
  • rspec commands (cont.)
    rspec spec –color
    Passing is green, pending is yellow, fail is red
    Store common options in .rspec file
    --color
    --format documentation
    Options stored in ./.rspec take precedence over ~/.rspec, options declared command line win
  • Let’s get started
    mkdir -p calculator/{lib,spec}
    cd calculator
    mate .
  • spec/calculator_spec.rb
    lib/calculator.rb
  • spec/calculator_spec.rb