public
Description: Tiny Ruby mock object library inspired by JMock
Homepage: http://dev.sanityinc.com/mockr
Clone URL: git://github.com/purcell/mockr.git
Click here to lend your support to: mockr and make a donation at www.pledgie.com !
mockr / README
100644 97 lines (68 sloc) 2.727 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
= Mockr
 
Mockr is a pure Ruby library to support the Mock Objects approach to
unit testing, and is inspired by Java's JMock.
 
Several other Mock Object libraries exist for Ruby. In addition to its
unusually natural syntax for setting expectations, Mockr has two main
distinguishing features:
 
1. Support for the distinction between mocking and stubbing
2. A constraint-based mechanism for matching call parameters
 
MockR was initially presented by author Steve Purcell at the
2005 European Ruby Conference, and was written entirely test-first.
 
For more information or to contact the author, see http://mockr.sanityinc.com.
 
== Introduction
 
An instance of Mockr::Mock can be programmed with responses to
methods calls expected during the course of a unit test. At the
end of the test, the instance can verify whether its expectations
were met, signalling a test failure if they were not.
 
Mocks distinguish between 'expected' method calls, which trigger
test failures if they are not made, and 'stub' method calls, which
are not verified. 'Expected' calls are typically those considered
critical to the proper use of the mocked class, and 'stub' calls are
those considered more flexible in their use.
 
== Example
 
The following is an example of a set of tests written entirely using MockR
 
  require 'test/unit'
  require 'mockr'
 
 
  class BurglarAlarmTest < Test::Unit::TestCase
    include Mockr::TestCaseHelpers
 
    def setup
      @laser_grid, @police_link = new_mock, new_mock
      @alarm = BurglarAlarm.new(@laser_grid.proxy, @police_link.proxy)
    end
 
    def test_police_station_not_contacted_if_grid_okay
      @laser_grid.expects.intact?.as { true }
      @alarm.check
    end
 
    def test_police_station_is_contacted_if_grid_not_okay
      @laser_grid.expects.intact?.as { false }
      @police_link.expects.incident("Grid breached")
      @alarm.check
    end
 
    def test_police_station_warned_if_grid_down
      @laser_grid.expects.intact?.as { raise IOError.new("comms down") }
      @police_link.expects.warning(/down/) # A loose parameter constraint
      @alarm.check
    end
 
  end
 
These tests would be satisfied by the following class:
 
  ## Collaborates with a LaserGrid and a PoliceStationUplink
  class BurglarAlarm
    def initialize(laser_grid, police_link)
      @laser_grid = laser_grid
      @police_link = police_link
    end
 
    def check
      begin
        @police_link.incident("Grid breached") unless @laser_grid.intact?
      rescue
        @police_link.warning("Grid down")
      end
    end
  end
 
== Resources
 
Home page
 
* http://mockr.sanityinc.com
 
== Copyright
 
Copyright (c) 2005-2006 Steve Purcell.
 
== Licence
 
MockR is distributed under the same terms as Ruby itself.