public
Description: Behaviour Driven Development framework for Ruby
Homepage: http://rspec.info
Clone URL: git://github.com/dchelimsky/rspec.git
Click here to lend your support to: rspec and make a donation at www.pledgie.com !
Bryan Helmkamp (author)
Fri Nov 20 14:21:26 -0800 2009
dchelimsky (committer)
Fri Nov 20 14:38:20 -0800 2009
rspec / features / matchers / define_matcher.feature
100644 180 lines (154 sloc) 5.617 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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
Feature: define matcher
 
  In order to express my domain clearly in my code examples
  As an RSpec user
  I want a shortcut to define custom matchers
 
  Scenario: define a matcher with default messages
    Given a file named "matcher_with_default_message_spec.rb" with:
      """
      Spec::Matchers.define :be_a_multiple_of do |expected|
        match do |actual|
          actual % expected == 0
        end
      end
 
      describe 9 do
        it {should be_a_multiple_of(3)}
      end
 
      describe 9 do
        it {should_not be_a_multiple_of(4)}
      end
 
      # fail intentionally to generate expected output
      describe 9 do
        it {should be_a_multiple_of(4)}
      end
 
      # fail intentionally to generate expected output
      describe 9 do
        it {should_not be_a_multiple_of(3)}
      end
 
      """
    When I run "spec matcher_with_default_message_spec.rb --format specdoc"
    Then the exit code should be 256
 
    And the stdout should include "should be a multiple of 3"
    And the stdout should include "should not be a multiple of 4"
    And the stdout should include "should be a multiple of 4 (FAILED - 1)"
    And the stdout should include "should not be a multiple of 3 (FAILED - 2)"
 
    And the stdout should include "4 examples, 2 failures"
    And the stdout should include "expected 9 to be a multiple of 4"
    And the stdout should include "expected 9 not to be a multiple of 3"
 
  Scenario: overriding the failure_message_for_should
    Given a file named "matcher_with_failure_message_spec.rb" with:
      """
      Spec::Matchers.define :be_a_multiple_of do |expected|
        match do |actual|
          actual % expected == 0
        end
        failure_message_for_should do |actual|
          "expected that #{actual} would be a multiple of #{expected}"
        end
      end
 
      # fail intentionally to generate expected output
      describe 9 do
        it {should be_a_multiple_of(4)}
      end
      """
    When I run "spec matcher_with_failure_message_spec.rb"
    Then the exit code should be 256
    And the stdout should include "1 example, 1 failure"
    And the stdout should include "expected that 9 would be a multiple of 4"
 
  Scenario: overriding the failure_message_for_should_not
    Given a file named "matcher_with_failure_for_message_spec.rb" with:
      """
      Spec::Matchers.define :be_a_multiple_of do |expected|
        match do |actual|
          actual % expected == 0
        end
        failure_message_for_should_not do |actual|
          "expected that #{actual} would not be a multiple of #{expected}"
        end
      end
 
      # fail intentionally to generate expected output
      describe 9 do
        it {should_not be_a_multiple_of(3)}
      end
      """
    When I run "spec matcher_with_failure_for_message_spec.rb"
    Then the exit code should be 256
    And the stdout should include "1 example, 1 failure"
    And the stdout should include "expected that 9 would not be a multiple of 3"
 
  Scenario: overriding the description
    Given a file named "matcher_overriding_description_spec.rb" with:
      """
      Spec::Matchers.define :be_a_multiple_of do |expected|
        match do |actual|
          actual % expected == 0
        end
        description do
          "be multiple of #{expected}"
        end
      end
 
      describe 9 do
        it {should be_a_multiple_of(3)}
      end
 
      describe 9 do
        it {should_not be_a_multiple_of(4)}
      end
      """
    When I run "spec matcher_overriding_description_spec.rb --format specdoc"
    Then the exit code should be 0
    And the stdout should include "2 examples, 0 failures"
    And the stdout should include "should be multiple of 3"
    And the stdout should include "should not be multiple of 4"
 
  Scenario: with no args
    Given a file named "matcher_with_no_args_spec.rb" with:
      """
      Spec::Matchers.define :have_7_fingers do
        match do |thing|
          thing.fingers.length == 7
        end
      end
 
      class Thing
        def fingers; (1..7).collect {"finger"}; end
      end
 
      describe Thing do
        it {should have_7_fingers}
      end
      """
    When I run "spec matcher_with_no_args_spec.rb --format specdoc"
    Then the exit code should be 0
    And the stdout should include "1 example, 0 failures"
    And the stdout should include "should have 7 fingers"
 
  Scenario: with multiple args
    Given a file named "matcher_with_multiple_args_spec.rb" with:
      """
      Spec::Matchers.define :be_the_sum_of do |a,b,c,d|
        match do |sum|
          a + b + c + d == sum
        end
      end
 
      describe 10 do
        it {should be_the_sum_of(1,2,3,4)}
      end
      """
    When I run "spec matcher_with_multiple_args_spec.rb --format specdoc"
    Then the exit code should be 0
    And the stdout should include "1 example, 0 failures"
    And the stdout should include "should be the sum of 1, 2, 3, and 4"
    
  Scenario: with helper methods
    Given a file named "matcher_with_internal_helper_spec.rb" with:
      """
      Spec::Matchers.define :have_same_elements_as do |sample|
        match do |actual|
          similar?(sample, actual)
        end
        
        def similar?(a, b)
          a.sort == b.sort
        end
      end
      
      describe "these two arrays" do
        specify "should be similar" do
          [1,2,3].should have_same_elements_as([2,3,1])
        end
      end
      """
    When I run "spec matcher_with_internal_helper_spec.rb"
    Then the exit code should be 0
    And the stdout should include "1 example, 0 failures"