rspec 101

Post on 15-Jan-2015

4.742 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Intro to RSpec methods

TRANSCRIPT

Rspec 101

Jason Noblehttp://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.should respond_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.should be_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.should be_empty

Predicate matchers (cont.)

• RSpec gives you other options– be_– be_a • ted.should be_a_kind_of(Player) => ted.kind_of?(Player)

– be_an• ted.should be_an_instance_of(Player) =>

ted.instance_of?(Player)

• RSpec also lets you write your own matchers

Matchers

• have_ becomes has_– request_params.should have_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

top related