rspec 101

38
Rspec 101 Jason Noble http://jasonnoble.org

Upload: jason-noble

Post on 15-Jan-2015

4.742 views

Category:

Technology


0 download

DESCRIPTION

Intro to RSpec methods

TRANSCRIPT

Page 1: Rspec 101

Rspec 101

Jason Noblehttp://jasonnoble.org

Page 2: Rspec 101

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

Page 3: Rspec 101

describe() Method

• describe “A User” {…}– A User

• describe User {…}– User

• describe User, “with no roles assigned” {…}– User with no roles assigned

Page 4: Rspec 101

Describe blocks can be nested

Page 5: Rspec 101

context() method

• context() is an alias for describe()• Use describe() for things, context() for context

Page 6: Rspec 101

it() method

• Argument should state what is being tested

Page 7: Rspec 101

Pending tests

• We can mark tests to be implemented “later”

Page 8: Rspec 101

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)

Page 9: Rspec 101

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

Page 10: Rspec 101

before(:each) method

Page 11: Rspec 101

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

Page 12: Rspec 101

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

Page 13: Rspec 101

after(:each) example

Page 14: Rspec 101

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

Page 15: Rspec 101

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

Page 16: Rspec 101

Helper Methods

• Defined within an example group• Available to all examples in the group

Page 17: Rspec 101

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

Page 18: Rspec 101

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

Page 19: Rspec 101

Shared examples (cont.)

Page 20: Rspec 101

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/)

Page 21: Rspec 101

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

Page 22: Rspec 101

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)

Page 23: Rspec 101

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)

Page 24: Rspec 101

Do not use != in expectations

• actual.should != expected

• action.should_not == expected

• Causes issues, explained in detail in the RSpec book

Page 25: Rspec 101

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

Page 26: Rspec 101

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

Page 27: Rspec 101

Expect{}

• Tests that a block of code causes some effect

• You can also use .to(1) or .from(0).to(1)

Page 28: Rspec 101

Predicate Matchers

• How do we test array.empty?

• array.empty?.should == true

• array.should be_empty

Page 29: Rspec 101

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

Page 30: Rspec 101

Matchers

• have_ becomes has_– request_params.should have_key(:id) =>

request_params.has_key?(:id).should == true

Page 31: Rspec 101

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)

Page 32: Rspec 101

subject {}

• Clean up your tests by specifying a subject

Page 33: Rspec 101

RSpec Mocks

• Mocks allow you to fake functionality that isn’t being tested. See the book for more info.

Page 34: Rspec 101

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

Page 35: Rspec 101

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

Page 36: Rspec 101

Let’s get started

• mkdir -p calculator/{lib,spec}• cd calculator• mate .

Page 37: Rspec 101

spec/calculator_spec.rb

lib/calculator.rb

Page 38: Rspec 101

spec/calculator_spec.rb