rspec-expectations 2.5.0 → 2.6.0.rc2
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/.travis.yml +7 -0
- data/Gemfile +13 -11
- data/README.md +2 -0
- data/Rakefile +28 -17
- data/features/Changelog.md +16 -0
- data/features/built_in_matchers/be.feature +4 -4
- data/features/built_in_matchers/be_within.feature +1 -1
- data/features/built_in_matchers/equality.feature +5 -5
- data/features/built_in_matchers/exist.feature +1 -1
- data/features/built_in_matchers/expect_change.feature +2 -2
- data/features/built_in_matchers/expect_error.feature +7 -7
- data/features/built_in_matchers/have.feature +2 -2
- data/features/built_in_matchers/include.feature +3 -3
- data/features/built_in_matchers/match.feature +2 -2
- data/features/built_in_matchers/operators.feature +3 -3
- data/features/built_in_matchers/predicates.feature +5 -5
- data/features/built_in_matchers/respond_to.feature +2 -2
- data/features/built_in_matchers/satisfy.feature +1 -1
- data/features/built_in_matchers/throw_symbol.feature +3 -3
- data/features/built_in_matchers/types.feature +2 -2
- data/features/custom_matchers/access_running_example.feature +2 -2
- data/features/custom_matchers/define_diffable_matcher.feature +1 -1
- data/features/custom_matchers/define_matcher.feature +40 -11
- data/features/custom_matchers/define_matcher_outside_rspec.feature +1 -1
- data/features/custom_matchers/define_matcher_with_fluent_interface.feature +1 -1
- data/features/customized_message.feature +1 -1
- data/features/diffing.feature +4 -4
- data/features/implicit_docstrings.feature +2 -2
- data/features/step_definitions/additional_cli_steps.rb +2 -2
- data/features/support/env.rb +5 -1
- data/features/test_frameworks/test_unit.feature +1 -1
- data/lib/rspec/expectations/backward_compatibility.rb +22 -1
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +10 -5
- data/lib/rspec/matchers/change.rb +47 -32
- data/lib/rspec/matchers/has.rb +15 -11
- data/lib/rspec/matchers/matcher.rb +4 -0
- data/spec/rspec/matchers/be_spec.rb +0 -4
- data/spec/rspec/matchers/change_spec.rb +84 -9
- data/spec/rspec/matchers/description_generation_spec.rb +41 -25
- data/spec/rspec/matchers/has_spec.rb +2 -2
- data/spec/rspec/matchers/have_spec.rb +21 -21
- data/spec/rspec/matchers/matcher_spec.rb +46 -0
- data/spec/rspec/matchers/matchers_spec.rb +3 -23
- data/spec/rspec/matchers/method_missing_spec.rb +23 -0
- data/spec/spec_helper.rb +2 -0
- metadata +23 -18
- data/spec/suite.rb +0 -1
data/lib/rspec/matchers/has.rb
CHANGED
@@ -1,35 +1,39 @@
|
|
1
1
|
module RSpec
|
2
2
|
module Matchers
|
3
|
-
|
4
3
|
class Has
|
5
|
-
|
6
4
|
def initialize(expected, *args)
|
7
5
|
@expected, @args = expected, args
|
8
6
|
end
|
9
|
-
|
7
|
+
|
10
8
|
def matches?(actual)
|
11
9
|
actual.__send__(predicate(@expected), *@args)
|
12
10
|
end
|
13
|
-
|
11
|
+
|
14
12
|
def failure_message_for_should
|
15
13
|
"expected ##{predicate(@expected)}(#{@args[0].inspect}) to return true, got false"
|
16
14
|
end
|
17
|
-
|
15
|
+
|
18
16
|
def failure_message_for_should_not
|
19
17
|
"expected ##{predicate(@expected)}(#{@args[0].inspect}) to return false, got true"
|
20
18
|
end
|
21
|
-
|
19
|
+
|
22
20
|
def description
|
23
|
-
|
21
|
+
[method_description(@expected), args_description(@args)].compact.join(' ')
|
24
22
|
end
|
25
|
-
|
23
|
+
|
26
24
|
private
|
27
|
-
|
28
25
|
def predicate(sym)
|
29
26
|
"#{sym.to_s.sub("have_","has_")}?".to_sym
|
30
27
|
end
|
31
|
-
|
28
|
+
|
29
|
+
def method_description(method)
|
30
|
+
method.to_s.gsub('_', ' ')
|
31
|
+
end
|
32
|
+
|
33
|
+
def args_description(args)
|
34
|
+
return nil if args.empty?
|
35
|
+
args.map { |arg| arg.inspect }.join(', ')
|
36
|
+
end
|
32
37
|
end
|
33
|
-
|
34
38
|
end
|
35
39
|
end
|
@@ -1,10 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "should be_predicate" do
|
4
|
-
it "allows other undefined methods to raise errors as normal" do
|
5
|
-
expect { some_undefined_method }.to raise_error(NameError)
|
6
|
-
end
|
7
|
-
|
8
4
|
it "passes when actual returns true for :predicate?" do
|
9
5
|
actual = stub("actual", :happy? => true)
|
10
6
|
actual.should be_happy
|
@@ -14,7 +14,7 @@ describe "should change(actual, message)" do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "passes when actual is modified by the block" do
|
17
|
-
expect {@instance.some_value = 6}.to change(@instance, :some_value)
|
17
|
+
expect {@instance.some_value = 6.0}.to change(@instance, :some_value)
|
18
18
|
end
|
19
19
|
|
20
20
|
it "fails when actual is not modified by the block" do
|
@@ -44,6 +44,57 @@ describe "should change(actual, message)" do
|
|
44
44
|
end.to fail_with("some_value should have changed, but is still true")
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
context "with nil value" do
|
49
|
+
before(:each) do
|
50
|
+
@instance = SomethingExpected.new
|
51
|
+
@instance.some_value = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "passes when actual is modified by the block" do
|
55
|
+
expect {@instance.some_value = false}.to change(@instance, :some_value)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "fails when actual is not modified by the block" do
|
59
|
+
expect do
|
60
|
+
expect {}.to change(@instance, :some_value)
|
61
|
+
end.to fail_with("some_value should have changed, but is still nil")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "with an array" do
|
66
|
+
before(:each) do
|
67
|
+
@instance = SomethingExpected.new
|
68
|
+
@instance.some_value = []
|
69
|
+
end
|
70
|
+
|
71
|
+
it "passes when actual is modified by the block" do
|
72
|
+
expect {@instance.some_value << 1}.to change(@instance, :some_value)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "fails when actual is not modified by the block" do
|
76
|
+
expect do
|
77
|
+
expect {}.to change(@instance, :some_value)
|
78
|
+
end.to fail_with("some_value should have changed, but is still []")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "with a hash" do
|
83
|
+
before(:each) do
|
84
|
+
@instance = SomethingExpected.new
|
85
|
+
@instance.some_value = {:a => 'a'}
|
86
|
+
end
|
87
|
+
|
88
|
+
it "passes when actual is modified by the block" do
|
89
|
+
expect {@instance.some_value[:a] = 'A'}.to change(@instance, :some_value)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "fails when actual is not modified by the block" do
|
93
|
+
expect do
|
94
|
+
expect {}.to change(@instance, :some_value)
|
95
|
+
end.to fail
|
96
|
+
end
|
97
|
+
end
|
47
98
|
end
|
48
99
|
|
49
100
|
describe "should_not change(actual, message)" do
|
@@ -273,11 +324,17 @@ describe "should change(actual, message).from(old)" do
|
|
273
324
|
@instance.some_value = 'string'
|
274
325
|
end
|
275
326
|
|
276
|
-
it "passes when attribute is
|
327
|
+
it "passes when attribute is === to expected value before executing block" do
|
277
328
|
expect { @instance.some_value = "astring" }.to change(@instance, :some_value).from("string")
|
278
329
|
end
|
279
330
|
|
280
|
-
it "
|
331
|
+
it "compares the expected and actual values with ===" do
|
332
|
+
expected = "string"
|
333
|
+
expected.should_receive(:===).and_return true
|
334
|
+
expect { @instance.some_value = "astring" }.to change(@instance, :some_value).from(expected)
|
335
|
+
end
|
336
|
+
|
337
|
+
it "fails when attribute is not === to expected value before executing block" do
|
281
338
|
expect do
|
282
339
|
expect { @instance.some_value = "knot" }.to change(@instance, :some_value).from("cat")
|
283
340
|
end.to fail_with("some_value should have initially been \"cat\", but was \"string\"")
|
@@ -291,11 +348,17 @@ describe "should change{ block }.from(old)" do
|
|
291
348
|
@instance.some_value = 'string'
|
292
349
|
end
|
293
350
|
|
294
|
-
it "passes when attribute is
|
351
|
+
it "passes when attribute is === to expected value before executing block" do
|
295
352
|
expect { @instance.some_value = "astring" }.to change{@instance.some_value}.from("string")
|
296
353
|
end
|
297
354
|
|
298
|
-
it "
|
355
|
+
it "compares the expected and actual values with ===" do
|
356
|
+
expected = "string"
|
357
|
+
expected.should_receive(:===).and_return true
|
358
|
+
expect { @instance.some_value = "astring" }.to change{@instance.some_value}.from(expected)
|
359
|
+
end
|
360
|
+
|
361
|
+
it "fails when attribute is not === to expected value before executing block" do
|
299
362
|
expect do
|
300
363
|
expect { @instance.some_value = "knot" }.to change{@instance.some_value}.from("cat")
|
301
364
|
end.to fail_with("result should have initially been \"cat\", but was \"string\"")
|
@@ -325,11 +388,17 @@ describe "should change(actual, message).to(new)" do
|
|
325
388
|
@instance.some_value = 'string'
|
326
389
|
end
|
327
390
|
|
328
|
-
it "passes when attribute is
|
391
|
+
it "passes when attribute is === to expected value after executing block" do
|
329
392
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to("cat")
|
330
393
|
end
|
331
394
|
|
332
|
-
it "
|
395
|
+
it "compares the expected and actual values with ===" do
|
396
|
+
expected = "cat"
|
397
|
+
expected.should_receive(:===).and_return true
|
398
|
+
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to(expected)
|
399
|
+
end
|
400
|
+
|
401
|
+
it "fails when attribute is not === to expected value after executing block" do
|
333
402
|
expect do
|
334
403
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog")
|
335
404
|
end.to fail_with("some_value should have been changed to \"dog\", but is now \"cat\"")
|
@@ -343,11 +412,17 @@ describe "should change{ block }.to(new)" do
|
|
343
412
|
@instance.some_value = 'string'
|
344
413
|
end
|
345
414
|
|
346
|
-
it "passes when attribute is
|
415
|
+
it "passes when attribute is === to expected value after executing block" do
|
347
416
|
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat")
|
348
417
|
end
|
349
418
|
|
350
|
-
it "
|
419
|
+
it "compares the expected and actual values with ===" do
|
420
|
+
expected = "cat"
|
421
|
+
expected.should_receive(:===).and_return true
|
422
|
+
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to(expected)
|
423
|
+
end
|
424
|
+
|
425
|
+
it "fails when attribute is not === to expected value after executing block" do
|
351
426
|
expect do
|
352
427
|
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("dog")
|
353
428
|
end.to fail_with("result should have been changed to \"dog\", but is now \"cat\"")
|
@@ -9,42 +9,42 @@ describe "Matchers should be able to generate their own descriptions" do
|
|
9
9
|
"this".should == "this"
|
10
10
|
RSpec::Matchers.generated_description.should == "should == \"this\""
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
it "should not == expected" do
|
14
14
|
"this".should_not == "that"
|
15
15
|
RSpec::Matchers.generated_description.should == "should not == \"that\""
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "should be empty (arbitrary predicate)" do
|
19
19
|
[].should be_empty
|
20
20
|
RSpec::Matchers.generated_description.should == "should be empty"
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it "should not be empty (arbitrary predicate)" do
|
24
24
|
[1].should_not be_empty
|
25
25
|
RSpec::Matchers.generated_description.should == "should not be empty"
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it "should be true" do
|
29
29
|
true.should be_true
|
30
30
|
RSpec::Matchers.generated_description.should == "should be true"
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
it "should be false" do
|
34
34
|
false.should be_false
|
35
35
|
RSpec::Matchers.generated_description.should == "should be false"
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
it "should be nil" do
|
39
39
|
nil.should be_nil
|
40
40
|
RSpec::Matchers.generated_description.should == "should be nil"
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
it "should be > n" do
|
44
44
|
5.should be > 3
|
45
45
|
RSpec::Matchers.generated_description.should == "should be > 3"
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
it "should be predicate arg1, arg2 and arg3" do
|
49
49
|
5.0.should be_between(0,10)
|
50
50
|
RSpec::Matchers.generated_description.should == "should be between 0 and 10"
|
@@ -55,42 +55,58 @@ describe "Matchers should be able to generate their own descriptions" do
|
|
55
55
|
expected.should equal(expected)
|
56
56
|
RSpec::Matchers.generated_description.should == "should equal \"expected\""
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
it "should_not equal" do
|
60
60
|
5.should_not equal(37)
|
61
61
|
RSpec::Matchers.generated_description.should == "should not equal 37"
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
it "should eql" do
|
65
65
|
"string".should eql("string")
|
66
66
|
RSpec::Matchers.generated_description.should == "should eql \"string\""
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
it "should not eql" do
|
70
70
|
"a".should_not eql(:a)
|
71
71
|
RSpec::Matchers.generated_description.should == "should not eql :a"
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
it "should have_key" do
|
75
75
|
{:a => "a"}.should have_key(:a)
|
76
76
|
RSpec::Matchers.generated_description.should == "should have key :a"
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
|
+
it "should have_some_method" do
|
80
|
+
object = Object.new
|
81
|
+
def object.has_eyes_closed?; true; end
|
82
|
+
|
83
|
+
object.should have_eyes_closed
|
84
|
+
RSpec::Matchers.generated_description.should == 'should have eyes closed'
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should have_some_method(args*)" do
|
88
|
+
object = Object.new
|
89
|
+
def object.has_taste_for?(*args); true; end
|
90
|
+
|
91
|
+
object.should have_taste_for("wine", "cheese")
|
92
|
+
RSpec::Matchers.generated_description.should == 'should have taste for "wine", "cheese"'
|
93
|
+
end
|
94
|
+
|
79
95
|
it "should have n items" do
|
80
96
|
team.should have(3).players
|
81
97
|
RSpec::Matchers.generated_description.should == "should have 3 players"
|
82
98
|
end
|
83
|
-
|
99
|
+
|
84
100
|
it "should have at least n items" do
|
85
101
|
team.should have_at_least(2).players
|
86
102
|
RSpec::Matchers.generated_description.should == "should have at least 2 players"
|
87
103
|
end
|
88
|
-
|
104
|
+
|
89
105
|
it "should have at most n items" do
|
90
106
|
team.should have_at_most(4).players
|
91
107
|
RSpec::Matchers.generated_description.should == "should have at most 4 players"
|
92
108
|
end
|
93
|
-
|
109
|
+
|
94
110
|
it "should include" do
|
95
111
|
[1,2,3].should include(3)
|
96
112
|
RSpec::Matchers.generated_description.should == "should include 3"
|
@@ -100,42 +116,42 @@ describe "Matchers should be able to generate their own descriptions" do
|
|
100
116
|
[1,2,3].should =~ [1,2,3]
|
101
117
|
RSpec::Matchers.generated_description.should == "should contain exactly 1, 2 and 3"
|
102
118
|
end
|
103
|
-
|
119
|
+
|
104
120
|
it "should match" do
|
105
121
|
"this string".should match(/this string/)
|
106
122
|
RSpec::Matchers.generated_description.should == "should match /this string/"
|
107
123
|
end
|
108
|
-
|
124
|
+
|
109
125
|
it "should raise_error" do
|
110
126
|
lambda { raise }.should raise_error
|
111
127
|
RSpec::Matchers.generated_description.should == "should raise Exception"
|
112
128
|
end
|
113
|
-
|
129
|
+
|
114
130
|
it "should raise_error with type" do
|
115
131
|
lambda { raise }.should raise_error(RuntimeError)
|
116
132
|
RSpec::Matchers.generated_description.should == "should raise RuntimeError"
|
117
133
|
end
|
118
|
-
|
134
|
+
|
119
135
|
it "should raise_error with type and message" do
|
120
136
|
lambda { raise "there was an error" }.should raise_error(RuntimeError, "there was an error")
|
121
137
|
RSpec::Matchers.generated_description.should == "should raise RuntimeError with \"there was an error\""
|
122
138
|
end
|
123
|
-
|
139
|
+
|
124
140
|
it "should respond_to" do
|
125
141
|
[].should respond_to(:insert)
|
126
142
|
RSpec::Matchers.generated_description.should == "should respond to #insert"
|
127
143
|
end
|
128
|
-
|
144
|
+
|
129
145
|
it "should throw symbol" do
|
130
146
|
lambda { throw :what_a_mess }.should throw_symbol
|
131
147
|
RSpec::Matchers.generated_description.should == "should throw a Symbol"
|
132
148
|
end
|
133
|
-
|
149
|
+
|
134
150
|
it "should throw symbol (with named symbol)" do
|
135
151
|
lambda { throw :what_a_mess }.should throw_symbol(:what_a_mess)
|
136
152
|
RSpec::Matchers.generated_description.should == "should throw :what_a_mess"
|
137
153
|
end
|
138
|
-
|
154
|
+
|
139
155
|
def team
|
140
156
|
Class.new do
|
141
157
|
def players
|
@@ -152,7 +168,7 @@ describe "a Matcher with no description" do
|
|
152
168
|
def failure_message; ""; end
|
153
169
|
end.new
|
154
170
|
end
|
155
|
-
|
171
|
+
|
156
172
|
it "provides a helpful message when used in a string-less example block" do
|
157
173
|
5.should matcher
|
158
174
|
RSpec::Matchers.generated_description.should =~ /When you call.*description method/m
|
@@ -26,7 +26,7 @@ describe "should have_sym(*args)" do
|
|
26
26
|
Object.new.should have_key(:a)
|
27
27
|
}.should raise_error(NoMethodError)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
it "reraises an exception thrown in #has_sym?(*args)" do
|
31
31
|
o = Object.new
|
32
32
|
def o.has_sym?(*args)
|
@@ -60,7 +60,7 @@ describe "should_not have_sym(*args)" do
|
|
60
60
|
Object.new.should have_key(:a)
|
61
61
|
}.should raise_error(NoMethodError)
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
it "reraises an exception thrown in #has_sym?(*args)" do
|
65
65
|
o = Object.new
|
66
66
|
def o.has_sym?(*args)
|
@@ -50,7 +50,7 @@ describe "have matcher" do
|
|
50
50
|
owner.should have(4).items_in_collection_with_size_method
|
51
51
|
}.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
it "fails if target has a collection of items with > n members" do
|
55
55
|
owner = create_collection_owner_with(3)
|
56
56
|
lambda {
|
@@ -63,7 +63,7 @@ describe "have matcher" do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
describe 'should have(1).item when ActiveSupport::Inflector is defined' do
|
66
|
-
|
66
|
+
|
67
67
|
it 'pluralizes the collection name' do
|
68
68
|
owner = create_collection_owner_with(1)
|
69
69
|
owner.should have(1).item
|
@@ -78,7 +78,7 @@ describe "have matcher" do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
82
|
after(:each) do
|
83
83
|
unless @active_support_was_defined
|
84
84
|
Object.__send__ :remove_const, :ActiveSupport
|
@@ -87,7 +87,7 @@ describe "have matcher" do
|
|
87
87
|
end
|
88
88
|
|
89
89
|
describe 'should have(1).item when Inflector is defined' do
|
90
|
-
|
90
|
+
|
91
91
|
before(:each) do
|
92
92
|
if defined?(Inflector)
|
93
93
|
@inflector_was_defined = true
|
@@ -100,7 +100,7 @@ describe "have matcher" do
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
it 'pluralizes the collection name' do
|
105
105
|
owner = create_collection_owner_with(1)
|
106
106
|
owner.should have(1).item
|
@@ -133,7 +133,7 @@ describe "have matcher" do
|
|
133
133
|
owner.should_not have(4).items_in_collection_with_length_method
|
134
134
|
owner.should_not have(4).items_in_collection_with_size_method
|
135
135
|
end
|
136
|
-
|
136
|
+
|
137
137
|
it "passes if target has a collection of items with > n members" do
|
138
138
|
owner = create_collection_owner_with(3)
|
139
139
|
owner.should_not have(2).items_in_collection_with_length_method
|
@@ -174,7 +174,7 @@ describe "have matcher" do
|
|
174
174
|
owner.should have_exactly(4).items_in_collection_with_size_method
|
175
175
|
}.should fail_with("expected 4 items_in_collection_with_size_method, got 3")
|
176
176
|
end
|
177
|
-
|
177
|
+
|
178
178
|
it "fails if target has a collection of items with > n members" do
|
179
179
|
owner = create_collection_owner_with(3)
|
180
180
|
lambda {
|
@@ -193,7 +193,7 @@ describe "have matcher" do
|
|
193
193
|
owner.should have_at_least(3).items_in_collection_with_length_method
|
194
194
|
owner.should have_at_least(3).items_in_collection_with_size_method
|
195
195
|
end
|
196
|
-
|
196
|
+
|
197
197
|
it "passes if target has a collection of items with > n members" do
|
198
198
|
owner = create_collection_owner_with(3)
|
199
199
|
owner.should have_at_least(2).items_in_collection_with_length_method
|
@@ -209,17 +209,17 @@ describe "have matcher" do
|
|
209
209
|
owner.should have_at_least(4).items_in_collection_with_size_method
|
210
210
|
}.should fail_with("expected at least 4 items_in_collection_with_size_method, got 3")
|
211
211
|
end
|
212
|
-
|
212
|
+
|
213
213
|
it "provides educational negative failure messages" do
|
214
214
|
#given
|
215
215
|
owner = create_collection_owner_with(3)
|
216
216
|
length_matcher = have_at_least(3).items_in_collection_with_length_method
|
217
217
|
size_matcher = have_at_least(3).items_in_collection_with_size_method
|
218
|
-
|
218
|
+
|
219
219
|
#when
|
220
220
|
length_matcher.matches?(owner)
|
221
221
|
size_matcher.matches?(owner)
|
222
|
-
|
222
|
+
|
223
223
|
#then
|
224
224
|
length_matcher.failure_message_for_should_not.should == <<-EOF
|
225
225
|
Isn't life confusing enough?
|
@@ -255,7 +255,7 @@ EOF
|
|
255
255
|
owner.should have_at_most(2).items_in_collection_with_size_method
|
256
256
|
}.should fail_with("expected at most 2 items_in_collection_with_size_method, got 3")
|
257
257
|
end
|
258
|
-
|
258
|
+
|
259
259
|
it "passes if target has a collection of items with < n members" do
|
260
260
|
owner = create_collection_owner_with(3)
|
261
261
|
owner.should have_at_most(4).items_in_collection_with_length_method
|
@@ -267,11 +267,11 @@ EOF
|
|
267
267
|
owner = create_collection_owner_with(3)
|
268
268
|
length_matcher = have_at_most(3).items_in_collection_with_length_method
|
269
269
|
size_matcher = have_at_most(3).items_in_collection_with_size_method
|
270
|
-
|
270
|
+
|
271
271
|
#when
|
272
272
|
length_matcher.matches?(owner)
|
273
273
|
size_matcher.matches?(owner)
|
274
|
-
|
274
|
+
|
275
275
|
#then
|
276
276
|
length_matcher.failure_message_for_should_not.should == <<-EOF
|
277
277
|
Isn't life confusing enough?
|
@@ -280,7 +280,7 @@ Instead of having to figure out the meaning of this:
|
|
280
280
|
We recommend that you use this instead:
|
281
281
|
should have_at_least(4).items_in_collection_with_length_method
|
282
282
|
EOF
|
283
|
-
|
283
|
+
|
284
284
|
size_matcher.failure_message_for_should_not.should == <<-EOF
|
285
285
|
Isn't life confusing enough?
|
286
286
|
Instead of having to figure out the meaning of this:
|
@@ -338,7 +338,7 @@ EOF
|
|
338
338
|
def @collection.floozles; [1,2] end
|
339
339
|
def @collection.send(*args); raise "DOH! Library developers shouldn't use #send!" end
|
340
340
|
end
|
341
|
-
|
341
|
+
|
342
342
|
it "works in the straightforward case" do
|
343
343
|
lambda {
|
344
344
|
@collection.should have(2).floozles
|
@@ -374,24 +374,24 @@ EOF
|
|
374
374
|
@a_method_which_have_defines = described_class.instance_methods.first
|
375
375
|
@a_method_which_object_defines = Object.instance_methods.first
|
376
376
|
end
|
377
|
-
|
377
|
+
|
378
378
|
it "is true for a method which Have defines" do
|
379
379
|
@have.should respond_to(@a_method_which_have_defines)
|
380
380
|
end
|
381
|
-
|
381
|
+
|
382
382
|
it "is true for a method that it's superclass (Object) defines" do
|
383
383
|
@have.should respond_to(@a_method_which_object_defines)
|
384
384
|
end
|
385
|
-
|
385
|
+
|
386
386
|
it "is false for a method which neither Object nor nor Have defines" do
|
387
387
|
@have.should_not respond_to(:foo_bar_baz)
|
388
388
|
end
|
389
|
-
|
389
|
+
|
390
390
|
it "is false if the owner doesn't respond to the method" do
|
391
391
|
have = described_class.new(99)
|
392
392
|
have.should_not respond_to(:problems)
|
393
393
|
end
|
394
|
-
|
394
|
+
|
395
395
|
it "is true if the owner responds to the method" do
|
396
396
|
have = described_class.new(:a_symbol)
|
397
397
|
have.should respond_to(:to_sym)
|