rspec-expectations 2.0.0.beta.22 → 2.0.0.rc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -1
- data/Gemfile +1 -0
- data/{History.md → History.markdown} +11 -1
- data/Rakefile +16 -1
- data/features/expectations/implicit_docstrings.feature +2 -2
- data/features/matchers/expect_error.feature +1 -1
- data/features/matchers/have.feature +103 -0
- data/features/matchers/operators.feature +280 -0
- data/features/matchers/predicates.feature +128 -0
- data/features/step_definitions/additional_cli_steps.rb +7 -0
- data/features/test_frameworks/test_unit.feature +29 -0
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +8 -0
- data/lib/rspec/matchers/change.rb +6 -2
- data/lib/rspec/matchers/satisfy.rb +4 -0
- data/spec/rspec/matchers/change_spec.rb +4 -0
- data/spec/rspec/matchers/matchers_spec.rb +49 -0
- data/spec/rspec/matchers/satisfy_spec.rb +4 -0
- metadata +42 -28
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
## rspec-expectations release history (incomplete)
|
2
2
|
|
3
|
+
### 2.0.0.rc / 2010-10-05
|
4
|
+
|
5
|
+
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.22...v2.0.0.rc)
|
6
|
+
|
7
|
+
* Enhancements
|
8
|
+
* require 'rspec/expectations' in a T::U or MiniUnit suite (Josep M. Bach)
|
9
|
+
|
10
|
+
* Bug fixes
|
11
|
+
* change by 0 passes/fails correctly (Len Smith)
|
12
|
+
* Add description to satisfy matcher
|
13
|
+
|
3
14
|
### 2.0.0.beta.22 / 2010-09-12
|
4
15
|
|
5
16
|
[full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.20...v2.0.0.beta.22)
|
@@ -13,4 +24,3 @@
|
|
13
24
|
|
14
25
|
* Bug fixes
|
15
26
|
* should[_not] change now handles boolean values correctly
|
16
|
-
|
data/Rakefile
CHANGED
@@ -5,6 +5,7 @@ Bundler::GemHelper.install_tasks
|
|
5
5
|
require 'rake'
|
6
6
|
require 'rake/rdoctask'
|
7
7
|
require 'rspec/core/rake_task'
|
8
|
+
require 'rspec/expectations/version'
|
8
9
|
require 'cucumber/rake/task'
|
9
10
|
|
10
11
|
RSpec::Core::RakeTask.new(:spec)
|
@@ -17,8 +18,22 @@ class Cucumber::Rake::Task::ForkedCucumberRunner
|
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
+
desc "Run all examples using rcov"
|
22
|
+
RSpec::Core::RakeTask.new :rcov => :cleanup_rcov_files do |t|
|
23
|
+
t.rcov = true
|
24
|
+
t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
|
25
|
+
t.rcov_opts << %[--text-report --sort coverage --no-html --aggregate coverage.data]
|
26
|
+
end
|
27
|
+
|
28
|
+
task :cleanup_rcov_files do
|
29
|
+
rm_rf 'coverage.data'
|
30
|
+
end
|
31
|
+
|
32
|
+
Cucumber::Rake::Task.new :cucumber => :cleanup_rcov_files do |t|
|
21
33
|
t.cucumber_opts = %w{--format progress}
|
34
|
+
t.rcov = true
|
35
|
+
t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
|
36
|
+
t.rcov_opts << %[--text-report --sort coverage --aggregate coverage.data]
|
22
37
|
end
|
23
38
|
|
24
39
|
task :default => [:spec, :cucumber]
|
@@ -24,7 +24,7 @@ Feature: implicit docstrings
|
|
24
24
|
And the output should contain "should include 2"
|
25
25
|
And the output should contain "should respond to #size"
|
26
26
|
|
27
|
-
Scenario
|
27
|
+
Scenario: run failing examples
|
28
28
|
Given a file named "failing_implicit_docstrings_spec.rb" with:
|
29
29
|
"""
|
30
30
|
describe "Failing examples with no descriptions" do
|
@@ -48,5 +48,5 @@ Feature: implicit docstrings
|
|
48
48
|
|
49
49
|
Then the output should contain "should equal 2"
|
50
50
|
And the output should contain "should be > 5"
|
51
|
-
And the output should contain "should include "
|
51
|
+
And the output should contain "should include 4"
|
52
52
|
And the output should contain "should not respond to #size"
|
@@ -0,0 +1,103 @@
|
|
1
|
+
Feature: have matchers
|
2
|
+
|
3
|
+
RSpec provides several matchers that make it easy to set expectations about the
|
4
|
+
size of a collection. There are three basic forms:
|
5
|
+
|
6
|
+
* collection.should have(x).items
|
7
|
+
* collection.should have_at_least(x).items
|
8
|
+
* collection.should have_at_most(x).items
|
9
|
+
|
10
|
+
In addition, #have_exactly is provided as an alias to #have.
|
11
|
+
|
12
|
+
These work on any collection-like object--the object just needs to respond to #size
|
13
|
+
or #length (or both). When the matcher is called directly on a collection object,
|
14
|
+
the #items call is pure syntactic sugar. You can use anything you want here. These
|
15
|
+
are equivalent:
|
16
|
+
|
17
|
+
* collection.should have(x).items
|
18
|
+
* collection.should have(x).things
|
19
|
+
|
20
|
+
You can also use this matcher on a non-collection object that returns a collection
|
21
|
+
from one of its methods. For example, Dir#entries returns an array, so you could
|
22
|
+
set an expectation using the following:
|
23
|
+
|
24
|
+
Dir.new("my/directory").should have(7).entries
|
25
|
+
|
26
|
+
Scenario: have(x).items on a collection
|
27
|
+
Given a file named "have_items_spec.rb" with:
|
28
|
+
"""
|
29
|
+
describe [1, 2, 3] do
|
30
|
+
it { should have(3).items }
|
31
|
+
it { should_not have(2).items }
|
32
|
+
it { should_not have(4).items }
|
33
|
+
|
34
|
+
it { should have_exactly(3).items }
|
35
|
+
it { should_not have_exactly(2).items }
|
36
|
+
it { should_not have_exactly(4).items }
|
37
|
+
|
38
|
+
it { should have_at_least(2).items }
|
39
|
+
it { should have_at_most(4).items }
|
40
|
+
|
41
|
+
# deliberate failures
|
42
|
+
it { should_not have(3).items }
|
43
|
+
it { should have(2).items }
|
44
|
+
it { should have(4).items }
|
45
|
+
|
46
|
+
it { should_not have_exactly(3).items }
|
47
|
+
it { should have_exactly(2).items }
|
48
|
+
it { should have_exactly(4).items }
|
49
|
+
|
50
|
+
it { should have_at_least(4).items }
|
51
|
+
it { should have_at_most(2).items }
|
52
|
+
end
|
53
|
+
"""
|
54
|
+
When I run "rspec have_items_spec.rb"
|
55
|
+
Then the output should contain "16 examples, 8 failures"
|
56
|
+
And the output should contain "expected target not to have 3 items, got 3"
|
57
|
+
And the output should contain "expected 2 items, got 3"
|
58
|
+
And the output should contain "expected 4 items, got 3"
|
59
|
+
And the output should contain "expected at least 4 items, got 3"
|
60
|
+
And the output should contain "expected at most 2 items, got 3"
|
61
|
+
|
62
|
+
Scenario: have(x).words on a String when String#words is defined
|
63
|
+
Given a file named "have_words_spec.rb" with:
|
64
|
+
"""
|
65
|
+
class String
|
66
|
+
def words
|
67
|
+
split(' ')
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "a sentence with some words" do
|
72
|
+
it { should have(5).words }
|
73
|
+
it { should_not have(4).words }
|
74
|
+
it { should_not have(6).words }
|
75
|
+
|
76
|
+
it { should have_exactly(5).words }
|
77
|
+
it { should_not have_exactly(4).words }
|
78
|
+
it { should_not have_exactly(6).words }
|
79
|
+
|
80
|
+
it { should have_at_least(4).words }
|
81
|
+
it { should have_at_most(6).words }
|
82
|
+
|
83
|
+
# deliberate failures
|
84
|
+
it { should_not have(5).words }
|
85
|
+
it { should have(4).words }
|
86
|
+
it { should have(6).words }
|
87
|
+
|
88
|
+
it { should_not have_exactly(5).words }
|
89
|
+
it { should have_exactly(4).words }
|
90
|
+
it { should have_exactly(6).words }
|
91
|
+
|
92
|
+
it { should have_at_least(6).words }
|
93
|
+
it { should have_at_most(4).words }
|
94
|
+
end
|
95
|
+
"""
|
96
|
+
When I run "rspec have_words_spec.rb"
|
97
|
+
Then the output should contain "16 examples, 8 failures"
|
98
|
+
And the output should contain "expected target not to have 5 words, got 5"
|
99
|
+
And the output should contain "expected 4 words, got 5"
|
100
|
+
And the output should contain "expected 6 words, got 5"
|
101
|
+
And the output should contain "expected at least 6 words, got 5"
|
102
|
+
And the output should contain "expected at most 4 words, got 5"
|
103
|
+
|
@@ -0,0 +1,280 @@
|
|
1
|
+
Feature: Operator Matchers
|
2
|
+
|
3
|
+
RSpec provides a number of matchers that are based on Ruby's built-in
|
4
|
+
operators. These mostly work like you expect. For example, each of these pass:
|
5
|
+
|
6
|
+
* 7.should == 7
|
7
|
+
* 25.2.should < 100
|
8
|
+
* 8.should > 7
|
9
|
+
* 17.should <= 17
|
10
|
+
* 3.should >= 2
|
11
|
+
* [1, 2, 3].should == [1, 2, 3]
|
12
|
+
* "this is a string".should =~ /^this/
|
13
|
+
* "this is a string".should_not =~ /^that/
|
14
|
+
* String.should === "this is a string"
|
15
|
+
|
16
|
+
RSpec also provides a `=~` matcher for arrays that disregards differences in
|
17
|
+
the ording between the actual and expected array. For example:
|
18
|
+
|
19
|
+
* [1, 2, 3].should =~ [2, 3, 1] # pass
|
20
|
+
* [:a, :c, :b].should =~ [:a, :c] # fail
|
21
|
+
|
22
|
+
Scenario: numeric operator matchers
|
23
|
+
Given a file named "numeric_operator_matchers_spec.rb" with:
|
24
|
+
"""
|
25
|
+
describe 18 do
|
26
|
+
it { should == 18 }
|
27
|
+
it { should < 20 }
|
28
|
+
it { should > 15 }
|
29
|
+
it { should <= 19 }
|
30
|
+
it { should >= 17 }
|
31
|
+
|
32
|
+
it { should_not == 28 }
|
33
|
+
it { should_not < 15 }
|
34
|
+
it { should_not > 20 }
|
35
|
+
it { should_not <= 17 }
|
36
|
+
it { should_not >= 19 }
|
37
|
+
|
38
|
+
# deliberate failures
|
39
|
+
it { should == 28 }
|
40
|
+
it { should < 15 }
|
41
|
+
it { should > 20 }
|
42
|
+
it { should <= 17 }
|
43
|
+
it { should >= 19 }
|
44
|
+
|
45
|
+
it { should_not == 18 }
|
46
|
+
it { should_not < 20 }
|
47
|
+
it { should_not > 15 }
|
48
|
+
it { should_not <= 19 }
|
49
|
+
it { should_not >= 17 }
|
50
|
+
end
|
51
|
+
"""
|
52
|
+
When I run "rspec numeric_operator_matchers_spec.rb"
|
53
|
+
Then the output should contain "20 examples, 10 failures"
|
54
|
+
And the output should contain:
|
55
|
+
"""
|
56
|
+
Failure/Error: it { should == 28 }
|
57
|
+
expected: 28,
|
58
|
+
got: 18 (using ==)
|
59
|
+
"""
|
60
|
+
And the output should contain:
|
61
|
+
"""
|
62
|
+
Failure/Error: it { should < 15 }
|
63
|
+
expected: < 15,
|
64
|
+
got: 18
|
65
|
+
"""
|
66
|
+
And the output should contain:
|
67
|
+
"""
|
68
|
+
Failure/Error: it { should > 20 }
|
69
|
+
expected: > 20,
|
70
|
+
got: 18
|
71
|
+
"""
|
72
|
+
And the output should contain:
|
73
|
+
"""
|
74
|
+
Failure/Error: it { should <= 17 }
|
75
|
+
expected: <= 17,
|
76
|
+
got: 18
|
77
|
+
"""
|
78
|
+
And the output should contain:
|
79
|
+
"""
|
80
|
+
Failure/Error: it { should >= 19 }
|
81
|
+
expected: >= 19,
|
82
|
+
got: 18
|
83
|
+
"""
|
84
|
+
And the output should contain:
|
85
|
+
"""
|
86
|
+
Failure/Error: it { should_not == 18 }
|
87
|
+
expected not: == 18,
|
88
|
+
got: 18
|
89
|
+
"""
|
90
|
+
And the output should contain:
|
91
|
+
"""
|
92
|
+
Failure/Error: it { should_not < 20 }
|
93
|
+
expected not: < 20,
|
94
|
+
got: 18
|
95
|
+
"""
|
96
|
+
And the output should contain:
|
97
|
+
"""
|
98
|
+
Failure/Error: it { should_not > 15 }
|
99
|
+
expected not: > 15,
|
100
|
+
got: 18
|
101
|
+
"""
|
102
|
+
And the output should contain:
|
103
|
+
"""
|
104
|
+
Failure/Error: it { should_not <= 19 }
|
105
|
+
expected not: <= 19,
|
106
|
+
got: 18
|
107
|
+
"""
|
108
|
+
And the output should contain:
|
109
|
+
"""
|
110
|
+
Failure/Error: it { should_not >= 17 }
|
111
|
+
expected not: >= 17,
|
112
|
+
got: 18
|
113
|
+
"""
|
114
|
+
|
115
|
+
Scenario: string operator matchers
|
116
|
+
Given a file named "string_operator_matchers_spec.rb" with:
|
117
|
+
"""
|
118
|
+
describe "Strawberry" do
|
119
|
+
it { should == "Strawberry" }
|
120
|
+
it { should < "Tomato" }
|
121
|
+
it { should > "Apple" }
|
122
|
+
it { should <= "Turnip" }
|
123
|
+
it { should >= "Banana" }
|
124
|
+
it { should =~ /berry/ }
|
125
|
+
|
126
|
+
it { should_not == "Peach" }
|
127
|
+
it { should_not < "Cranberry" }
|
128
|
+
it { should_not > "Zuchini" }
|
129
|
+
it { should_not <= "Potato" }
|
130
|
+
it { should_not >= "Tomato" }
|
131
|
+
it { should_not =~ /apple/ }
|
132
|
+
|
133
|
+
it "reports that it is a string using ===" do
|
134
|
+
String.should === subject
|
135
|
+
end
|
136
|
+
|
137
|
+
# deliberate failures
|
138
|
+
it { should == "Peach" }
|
139
|
+
it { should < "Cranberry" }
|
140
|
+
it { should > "Zuchini" }
|
141
|
+
it { should <= "Potato" }
|
142
|
+
it { should >= "Tomato" }
|
143
|
+
it { should =~ /apple/ }
|
144
|
+
|
145
|
+
it { should_not == "Strawberry" }
|
146
|
+
it { should_not < "Tomato" }
|
147
|
+
it { should_not > "Apple" }
|
148
|
+
it { should_not <= "Turnip" }
|
149
|
+
it { should_not >= "Banana" }
|
150
|
+
it { should_not =~ /berry/ }
|
151
|
+
|
152
|
+
it "fails a spec asserting that it is a symbol" do
|
153
|
+
Symbol.should === subject
|
154
|
+
end
|
155
|
+
end
|
156
|
+
"""
|
157
|
+
When I run "rspec string_operator_matchers_spec.rb"
|
158
|
+
Then the output should contain "26 examples, 13 failures"
|
159
|
+
And the output should contain:
|
160
|
+
"""
|
161
|
+
Failure/Error: it { should == "Peach" }
|
162
|
+
expected: "Peach",
|
163
|
+
got: "Strawberry" (using ==)
|
164
|
+
"""
|
165
|
+
And the output should contain:
|
166
|
+
"""
|
167
|
+
Failure/Error: it { should < "Cranberry" }
|
168
|
+
expected: < "Cranberry",
|
169
|
+
got: "Strawberry"
|
170
|
+
"""
|
171
|
+
And the output should contain:
|
172
|
+
"""
|
173
|
+
Failure/Error: it { should > "Zuchini" }
|
174
|
+
expected: > "Zuchini",
|
175
|
+
got: "Strawberry"
|
176
|
+
"""
|
177
|
+
And the output should contain:
|
178
|
+
"""
|
179
|
+
Failure/Error: it { should <= "Potato" }
|
180
|
+
expected: <= "Potato",
|
181
|
+
got: "Strawberry"
|
182
|
+
"""
|
183
|
+
And the output should contain:
|
184
|
+
"""
|
185
|
+
Failure/Error: it { should >= "Tomato" }
|
186
|
+
expected: >= "Tomato",
|
187
|
+
got: "Strawberry"
|
188
|
+
"""
|
189
|
+
And the output should contain:
|
190
|
+
"""
|
191
|
+
Failure/Error: it { should =~ /apple/ }
|
192
|
+
expected: /apple/,
|
193
|
+
got: "Strawberry" (using =~)
|
194
|
+
"""
|
195
|
+
And the output should contain:
|
196
|
+
"""
|
197
|
+
Failure/Error: it { should_not == "Strawberry" }
|
198
|
+
expected not: == "Strawberry",
|
199
|
+
got: "Strawberry"
|
200
|
+
"""
|
201
|
+
And the output should contain:
|
202
|
+
"""
|
203
|
+
Failure/Error: it { should_not < "Tomato" }
|
204
|
+
expected not: < "Tomato",
|
205
|
+
got: "Strawberry"
|
206
|
+
"""
|
207
|
+
And the output should contain:
|
208
|
+
"""
|
209
|
+
Failure/Error: it { should_not > "Apple" }
|
210
|
+
expected not: > "Apple",
|
211
|
+
got: "Strawberry"
|
212
|
+
"""
|
213
|
+
And the output should contain:
|
214
|
+
"""
|
215
|
+
Failure/Error: it { should_not <= "Turnip" }
|
216
|
+
expected not: <= "Turnip",
|
217
|
+
got: "Strawberry"
|
218
|
+
"""
|
219
|
+
And the output should contain:
|
220
|
+
"""
|
221
|
+
Failure/Error: it { should_not >= "Banana" }
|
222
|
+
expected not: >= "Banana",
|
223
|
+
got: "Strawberry"
|
224
|
+
"""
|
225
|
+
And the output should contain:
|
226
|
+
"""
|
227
|
+
Failure/Error: it { should_not =~ /berry/ }
|
228
|
+
expected not: =~ /berry/,
|
229
|
+
got: "Strawberry"
|
230
|
+
"""
|
231
|
+
And the output should contain:
|
232
|
+
"""
|
233
|
+
Failure/Error: Symbol.should === subject
|
234
|
+
expected: "Strawberry",
|
235
|
+
got: Symbol (using ===)
|
236
|
+
"""
|
237
|
+
|
238
|
+
Scenario: array operator matchers
|
239
|
+
Given a file named "array_operator_matchers_spec.rb" with:
|
240
|
+
"""
|
241
|
+
describe [1, 2, 3] do
|
242
|
+
it { should == [1, 2, 3] }
|
243
|
+
it { should_not == [1, 3, 2] }
|
244
|
+
|
245
|
+
it { should =~ [1, 2, 3] }
|
246
|
+
it { should =~ [1, 3, 2] }
|
247
|
+
it { should =~ [2, 1, 3] }
|
248
|
+
it { should =~ [2, 3, 1] }
|
249
|
+
it { should =~ [3, 1, 2] }
|
250
|
+
it { should =~ [3, 2, 1] }
|
251
|
+
|
252
|
+
# deliberate failures
|
253
|
+
it { should_not == [1, 2, 3] }
|
254
|
+
it { should == [1, 3, 2] }
|
255
|
+
it { should =~ [1, 2, 1] }
|
256
|
+
end
|
257
|
+
"""
|
258
|
+
When I run "rspec array_operator_matchers_spec.rb"
|
259
|
+
Then the output should contain "11 examples, 3 failures"
|
260
|
+
And the output should contain:
|
261
|
+
"""
|
262
|
+
Failure/Error: it { should_not == [1, 2, 3] }
|
263
|
+
expected not: == [1, 2, 3],
|
264
|
+
got: [1, 2, 3]
|
265
|
+
"""
|
266
|
+
And the output should contain:
|
267
|
+
"""
|
268
|
+
Failure/Error: it { should == [1, 3, 2] }
|
269
|
+
expected: [1, 3, 2],
|
270
|
+
got: [1, 2, 3] (using ==)
|
271
|
+
"""
|
272
|
+
And the output should contain:
|
273
|
+
"""
|
274
|
+
Failure/Error: it { should =~ [1, 2, 1] }
|
275
|
+
expected collection contained: [1, 1, 2]
|
276
|
+
actual collection contained: [1, 2, 3]
|
277
|
+
the missing elements were: [1]
|
278
|
+
the extra elements were: [3]
|
279
|
+
"""
|
280
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
Feature: predicate matchers
|
2
|
+
|
3
|
+
Ruby objects commonly provide predicate methods:
|
4
|
+
|
5
|
+
* 7.zero? # => false
|
6
|
+
* 0.zero? # => true
|
7
|
+
* [1].empty? # => false
|
8
|
+
* [].empty? # => true
|
9
|
+
* { :a => 5 }.has_key?(:b) # => false
|
10
|
+
* { :b => 5 }.has_key?(:b) # => true
|
11
|
+
|
12
|
+
You could use a basic equality matcher to set expectations on these:
|
13
|
+
|
14
|
+
7.zero?.should == true # fails with "expected true, got false (using ==)"
|
15
|
+
|
16
|
+
...but RSpec provides dynamic predicate matchers that are more readable and
|
17
|
+
provide better failure output.
|
18
|
+
|
19
|
+
For any predicate method, RSpec gives you a corresponding matcher. Simply
|
20
|
+
prefix the method with "be_" and remove the question mark. Examples:
|
21
|
+
|
22
|
+
* 7.should_not be_zero # calls 7.zero?
|
23
|
+
* [].should be_empty # calls [].empty?
|
24
|
+
* x.should be_multiple_of(3) # calls x.multiple_of?(3)
|
25
|
+
|
26
|
+
Alternately, for a predicate method that begins with "has_" like Hash#has_key?,
|
27
|
+
RSpec allows you to use an alternate form since "be_has_key" makes no sense.
|
28
|
+
|
29
|
+
* hash.should have_key(:foo) # calls hash.has_key?(:foo)
|
30
|
+
* array.should_not have_odd_values # calls array.has_odd_values?
|
31
|
+
|
32
|
+
In either case, RSpec provides nice, clear error messages, such as:
|
33
|
+
|
34
|
+
expected zero? to return true, got false
|
35
|
+
|
36
|
+
Any arguments passed to the matcher will be passed on to the predicate method.
|
37
|
+
|
38
|
+
Scenario: should be_zero (based on Fixnum#zero?)
|
39
|
+
Given a file named "should_be_zero_spec.rb" with:
|
40
|
+
"""
|
41
|
+
describe 0 do
|
42
|
+
it { should be_zero }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 7 do
|
46
|
+
it { should be_zero } # deliberate failure
|
47
|
+
end
|
48
|
+
"""
|
49
|
+
When I run "rspec should_be_zero_spec.rb"
|
50
|
+
Then the output should contain "2 examples, 1 failure"
|
51
|
+
And the output should contain "expected zero? to return true, got false"
|
52
|
+
|
53
|
+
Scenario: should_not be_empty (based on Array#empty?)
|
54
|
+
Given a file named "should_not_be_empty_spec.rb" with:
|
55
|
+
"""
|
56
|
+
describe [1, 2, 3] do
|
57
|
+
it { should_not be_empty }
|
58
|
+
end
|
59
|
+
|
60
|
+
describe [] do
|
61
|
+
it { should_not be_empty } # deliberate failure
|
62
|
+
end
|
63
|
+
"""
|
64
|
+
When I run "rspec should_not_be_empty_spec.rb"
|
65
|
+
Then the output should contain "2 examples, 1 failure"
|
66
|
+
And the output should contain "expected empty? to return false, got true"
|
67
|
+
|
68
|
+
Scenario: should have_key (based on Hash#has_key?)
|
69
|
+
Given a file named "should_have_key_spec.rb" with:
|
70
|
+
"""
|
71
|
+
describe Hash do
|
72
|
+
subject { { :foo => 7 } }
|
73
|
+
it { should have_key(:foo) }
|
74
|
+
it { should have_key(:bar) } # deliberate failure
|
75
|
+
end
|
76
|
+
"""
|
77
|
+
When I run "rspec should_have_key_spec.rb"
|
78
|
+
Then the output should contain "2 examples, 1 failure"
|
79
|
+
And the output should contain "expected #has_key?(:bar) to return true, got false"
|
80
|
+
|
81
|
+
Scenario: should_not have_all_string_keys (based on custom #has_all_string_keys? method)
|
82
|
+
Given a file named "should_not_have_all_string_keys_spec.rb" with:
|
83
|
+
"""
|
84
|
+
class Hash
|
85
|
+
def has_all_string_keys?
|
86
|
+
keys.all? { |k| String === k }
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe Hash do
|
91
|
+
context 'with symbol keys' do
|
92
|
+
subject { { :foo => 7, :bar => 5 } }
|
93
|
+
it { should_not have_all_string_keys }
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'with string keys' do
|
97
|
+
subject { { 'foo' => 7, 'bar' => 5 } }
|
98
|
+
it { should_not have_all_string_keys } # deliberate failure
|
99
|
+
end
|
100
|
+
end
|
101
|
+
"""
|
102
|
+
When I run "rspec should_not_have_all_string_keys_spec.rb"
|
103
|
+
Then the output should contain "2 examples, 1 failure"
|
104
|
+
And the output should contain "expected #has_all_string_keys?(nil) to return false, got true"
|
105
|
+
|
106
|
+
Scenario: matcher arguments are passed on to the predicate method
|
107
|
+
Given a file named "predicate_matcher_argument_spec.rb" with:
|
108
|
+
"""
|
109
|
+
class Fixnum
|
110
|
+
def multiple_of?(x)
|
111
|
+
(self % x).zero?
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe 12 do
|
116
|
+
it { should be_multiple_of(3) }
|
117
|
+
it { should_not be_multiple_of(7) }
|
118
|
+
|
119
|
+
# deliberate failures
|
120
|
+
it { should_not be_multiple_of(4) }
|
121
|
+
it { should be_multiple_of(5) }
|
122
|
+
end
|
123
|
+
"""
|
124
|
+
When I run "rspec predicate_matcher_argument_spec.rb"
|
125
|
+
Then the output should contain "4 examples, 2 failures"
|
126
|
+
And the output should contain "expected multiple_of?(4) to return false, got true"
|
127
|
+
And the output should contain "expected multiple_of?(5) to return true, got false"
|
128
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Useful for when the output is slightly different on different versions of ruby
|
2
|
+
Then /^the output should contain "([^"]*)" or "([^"]*)"$/ do |string1, string2|
|
3
|
+
unless [string1, string2].any? { |s| combined_output =~ Regexp.compile(s) }
|
4
|
+
fail %Q{Neither "#{string1}" or "#{string2}" were found in:\n#{combined_output}}
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
Feature: Test::Unit integration
|
2
|
+
|
3
|
+
RSpec-expectations is a stand-alone gem that can be used without
|
4
|
+
the rest of RSpec. It can easily be used with another test
|
5
|
+
framework such as Test::Unit if you like RSpec's should/should_not
|
6
|
+
syntax but prefer the test organization of another framework.
|
7
|
+
|
8
|
+
Scenario: Basic Test::Unit usage
|
9
|
+
Given a file named "rspec_expectations_test.rb" with:
|
10
|
+
"""
|
11
|
+
require 'test/unit'
|
12
|
+
require 'rspec/expectations'
|
13
|
+
|
14
|
+
class RSpecExpectationsTest < Test::Unit::TestCase
|
15
|
+
def test_passing_expectation
|
16
|
+
x = 1 + 3
|
17
|
+
x.should == 4
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_failing_expectation
|
21
|
+
array = [1, 2]
|
22
|
+
array.should be_empty
|
23
|
+
end
|
24
|
+
end
|
25
|
+
"""
|
26
|
+
When I run "ruby rspec_expectations_test.rb"
|
27
|
+
Then the output should contain "2 tests"
|
28
|
+
And the output should contain "1 failure" or "1 error"
|
29
|
+
And the output should contain "expected empty? to return true, got false"
|
data/lib/rspec/matchers.rb
CHANGED
@@ -158,6 +158,14 @@ module RSpec
|
|
158
158
|
if RSpec.respond_to?(:configure)
|
159
159
|
RSpec.configure {|c| c.include self}
|
160
160
|
end
|
161
|
+
|
162
|
+
# Include Matchers for other test frameworks
|
163
|
+
if defined?(Test::Unit::TestCase)
|
164
|
+
Test::Unit::TestCase.send(:include, self)
|
165
|
+
end
|
166
|
+
if defined?(MiniTest::Unit::TestCase)
|
167
|
+
MiniTest::Unit::TestCase.send(:include, self)
|
168
|
+
end
|
161
169
|
end
|
162
170
|
end
|
163
171
|
|
@@ -16,8 +16,8 @@ module RSpec
|
|
16
16
|
@before = evaluate_value_proc
|
17
17
|
event_proc.call
|
18
18
|
@after = evaluate_value_proc
|
19
|
-
|
20
|
-
changed? && matches_before? && matches_after? && matches_amount? && matches_min? && matches_max?
|
19
|
+
|
20
|
+
(!change_expected? || changed?) && matches_before? && matches_after? && matches_amount? && matches_min? && matches_max?
|
21
21
|
end
|
22
22
|
|
23
23
|
def raise_block_syntax_error
|
@@ -92,6 +92,10 @@ MESSAGE
|
|
92
92
|
@message || "result"
|
93
93
|
end
|
94
94
|
|
95
|
+
def change_expected?
|
96
|
+
@amount != 0
|
97
|
+
end
|
98
|
+
|
95
99
|
def changed?
|
96
100
|
@before != @after
|
97
101
|
end
|
@@ -123,6 +123,10 @@ describe "should change(actual, message).by(expected)" do
|
|
123
123
|
expect { @instance.some_value += 1 }.to change(@instance, :some_value).by(1)
|
124
124
|
end
|
125
125
|
|
126
|
+
it "passes when attribute is not changed and expected amount is 0" do
|
127
|
+
expect { @instance.some_value += 0 }.to change(@instance, :some_value).by(0)
|
128
|
+
end
|
129
|
+
|
126
130
|
it "fails when the attribute is changed by unexpected amount" do
|
127
131
|
expect do
|
128
132
|
expect { @instance.some_value += 2 }.to change(@instance, :some_value).by(1)
|
@@ -1,2 +1,51 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
module Test
|
4
|
+
module Unit
|
5
|
+
class TestCase
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module MiniTest
|
11
|
+
module Unit
|
12
|
+
class TestCase
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module RSpec
|
18
|
+
describe Matchers do
|
19
|
+
|
20
|
+
let(:sample_matchers) do
|
21
|
+
[:be,
|
22
|
+
:be_close,
|
23
|
+
:be_instance_of,
|
24
|
+
:be_kind_of]
|
25
|
+
end
|
26
|
+
|
27
|
+
context "once required" do
|
28
|
+
|
29
|
+
before(:all) do
|
30
|
+
path = File.expand_path("../../../../#{path}", __FILE__)
|
31
|
+
load File.join(path, 'lib/rspec/matchers.rb')
|
32
|
+
end
|
33
|
+
|
34
|
+
it "includes itself in Test::Unit::TestCase" do
|
35
|
+
test_unit_case = Test::Unit::TestCase.new
|
36
|
+
sample_matchers.each do |sample_matcher|
|
37
|
+
test_unit_case.should respond_to(sample_matcher)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "includes itself in MiniTest::Unit::TestCase" do
|
42
|
+
minitest_case = MiniTest::Unit::TestCase.new
|
43
|
+
sample_matchers.each do |sample_matcher|
|
44
|
+
minitest_case.should respond_to(sample_matcher)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-expectations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 7712058
|
4
5
|
prerelease: true
|
5
6
|
segments:
|
6
7
|
- 2
|
7
8
|
- 0
|
8
9
|
- 0
|
9
|
-
-
|
10
|
-
|
11
|
-
version: 2.0.0.beta.22
|
10
|
+
- rc
|
11
|
+
version: 2.0.0.rc
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- David Chelimsky
|
@@ -17,88 +17,91 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
20
|
+
date: 2010-10-04 00:00:00 -05:00
|
21
21
|
default_executable:
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
|
-
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
25
|
none: false
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
29
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
30
|
segments:
|
31
31
|
- 1
|
32
32
|
- 1
|
33
33
|
- 2
|
34
34
|
version: 1.1.2
|
35
|
+
requirement: *id001
|
35
36
|
type: :runtime
|
37
|
+
name: diff-lcs
|
36
38
|
prerelease: false
|
37
|
-
version_requirements: *id001
|
38
39
|
- !ruby/object:Gem::Dependency
|
39
|
-
|
40
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
45
46
|
segments:
|
46
47
|
- 0
|
47
48
|
- 6
|
48
49
|
- 2
|
49
50
|
version: 0.6.2
|
51
|
+
requirement: *id002
|
50
52
|
type: :development
|
53
|
+
name: cucumber
|
51
54
|
prerelease: false
|
52
|
-
version_requirements: *id002
|
53
55
|
- !ruby/object:Gem::Dependency
|
54
|
-
|
55
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
57
|
none: false
|
57
58
|
requirements:
|
58
59
|
- - ">="
|
59
60
|
- !ruby/object:Gem::Version
|
61
|
+
hash: 25
|
60
62
|
segments:
|
61
63
|
- 0
|
62
64
|
- 1
|
63
65
|
- 1
|
64
66
|
version: 0.1.1
|
67
|
+
requirement: *id003
|
65
68
|
type: :development
|
69
|
+
name: aruba
|
66
70
|
prerelease: false
|
67
|
-
version_requirements: *id003
|
68
71
|
- !ruby/object:Gem::Dependency
|
69
|
-
|
70
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
71
73
|
none: false
|
72
74
|
requirements:
|
73
75
|
- - ">="
|
74
76
|
- !ruby/object:Gem::Version
|
77
|
+
hash: 7712058
|
75
78
|
segments:
|
76
79
|
- 2
|
77
80
|
- 0
|
78
81
|
- 0
|
79
|
-
-
|
80
|
-
|
81
|
-
|
82
|
+
- rc
|
83
|
+
version: 2.0.0.rc
|
84
|
+
requirement: *id004
|
82
85
|
type: :development
|
86
|
+
name: rspec-core
|
83
87
|
prerelease: false
|
84
|
-
version_requirements: *id004
|
85
88
|
- !ruby/object:Gem::Dependency
|
86
|
-
|
87
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
88
90
|
none: false
|
89
91
|
requirements:
|
90
92
|
- - ">="
|
91
93
|
- !ruby/object:Gem::Version
|
94
|
+
hash: 7712058
|
92
95
|
segments:
|
93
96
|
- 2
|
94
97
|
- 0
|
95
98
|
- 0
|
96
|
-
-
|
97
|
-
|
98
|
-
|
99
|
+
- rc
|
100
|
+
version: 2.0.0.rc
|
101
|
+
requirement: *id005
|
99
102
|
type: :development
|
103
|
+
name: rspec-mocks
|
100
104
|
prerelease: false
|
101
|
-
version_requirements: *id005
|
102
105
|
description: rspec expectations (should[_not] and matchers)
|
103
106
|
email: dchelimsky@gmail.com;chad.humphries@gmail.com
|
104
107
|
executables: []
|
@@ -111,7 +114,7 @@ files:
|
|
111
114
|
- .document
|
112
115
|
- .gitignore
|
113
116
|
- Gemfile
|
114
|
-
- History.
|
117
|
+
- History.markdown
|
115
118
|
- License.txt
|
116
119
|
- README.markdown
|
117
120
|
- Rakefile
|
@@ -130,7 +133,12 @@ files:
|
|
130
133
|
- features/matchers/equality.feature
|
131
134
|
- features/matchers/expect_change.feature
|
132
135
|
- features/matchers/expect_error.feature
|
136
|
+
- features/matchers/have.feature
|
137
|
+
- features/matchers/operators.feature
|
138
|
+
- features/matchers/predicates.feature
|
139
|
+
- features/step_definitions/additional_cli_steps.rb
|
133
140
|
- features/support/env.rb
|
141
|
+
- features/test_frameworks/test_unit.feature
|
134
142
|
- lib/rspec-expectations.rb
|
135
143
|
- lib/rspec/expectations.rb
|
136
144
|
- lib/rspec/expectations/backward_compatibility.rb
|
@@ -218,7 +226,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
226
|
requirements:
|
219
227
|
- - ">="
|
220
228
|
- !ruby/object:Gem::Version
|
221
|
-
hash:
|
229
|
+
hash: 3
|
222
230
|
segments:
|
223
231
|
- 0
|
224
232
|
version: "0"
|
@@ -227,6 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
235
|
requirements:
|
228
236
|
- - ">"
|
229
237
|
- !ruby/object:Gem::Version
|
238
|
+
hash: 25
|
230
239
|
segments:
|
231
240
|
- 1
|
232
241
|
- 3
|
@@ -238,7 +247,7 @@ rubyforge_project: rspec
|
|
238
247
|
rubygems_version: 1.3.7
|
239
248
|
signing_key:
|
240
249
|
specification_version: 3
|
241
|
-
summary: rspec-expectations-2.0.0.
|
250
|
+
summary: rspec-expectations-2.0.0.rc
|
242
251
|
test_files:
|
243
252
|
- features/README.markdown
|
244
253
|
- features/expectations/attribute_of_subject.feature
|
@@ -253,7 +262,12 @@ test_files:
|
|
253
262
|
- features/matchers/equality.feature
|
254
263
|
- features/matchers/expect_change.feature
|
255
264
|
- features/matchers/expect_error.feature
|
265
|
+
- features/matchers/have.feature
|
266
|
+
- features/matchers/operators.feature
|
267
|
+
- features/matchers/predicates.feature
|
268
|
+
- features/step_definitions/additional_cli_steps.rb
|
256
269
|
- features/support/env.rb
|
270
|
+
- features/test_frameworks/test_unit.feature
|
257
271
|
- spec/rspec/expectations/differ_spec.rb
|
258
272
|
- spec/rspec/expectations/extensions/kernel_spec.rb
|
259
273
|
- spec/rspec/expectations/fail_with_spec.rb
|