rspec-expectations 2.13.0 → 2.14.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/Changelog.md +34 -0
  2. data/README.md +43 -87
  3. data/features/README.md +8 -9
  4. data/features/built_in_matchers/README.md +41 -41
  5. data/features/built_in_matchers/be_within.feature +3 -3
  6. data/features/built_in_matchers/expect_change.feature +6 -6
  7. data/features/built_in_matchers/expect_error.feature +2 -2
  8. data/features/built_in_matchers/start_with.feature +1 -1
  9. data/features/built_in_matchers/throw_symbol.feature +11 -11
  10. data/features/built_in_matchers/yield.feature +18 -3
  11. data/features/custom_matchers/define_diffable_matcher.feature +1 -1
  12. data/features/custom_matchers/define_matcher_outside_rspec.feature +6 -6
  13. data/features/custom_matchers/define_matcher_with_fluent_interface.feature +1 -1
  14. data/features/customized_message.feature +1 -1
  15. data/features/support/env.rb +10 -1
  16. data/features/syntax_configuration.feature +3 -0
  17. data/features/test_frameworks/test_unit.feature +15 -17
  18. data/lib/rspec/expectations.rb +1 -1
  19. data/lib/rspec/expectations/deprecation.rb +12 -33
  20. data/lib/rspec/expectations/differ.rb +25 -7
  21. data/lib/rspec/expectations/expectation_target.rb +7 -8
  22. data/lib/rspec/expectations/extensions/object.rb +2 -12
  23. data/lib/rspec/expectations/fail_with.rb +11 -1
  24. data/lib/rspec/expectations/handler.rb +11 -6
  25. data/lib/rspec/expectations/syntax.rb +2 -2
  26. data/lib/rspec/expectations/version.rb +1 -1
  27. data/lib/rspec/matchers.rb +134 -144
  28. data/lib/rspec/matchers/be_close.rb +1 -1
  29. data/lib/rspec/matchers/built_in/be_within.rb +1 -1
  30. data/lib/rspec/matchers/built_in/have.rb +20 -4
  31. data/lib/rspec/matchers/built_in/raise_error.rb +23 -7
  32. data/lib/rspec/matchers/built_in/yield.rb +78 -3
  33. data/lib/rspec/matchers/operator_matcher.rb +1 -1
  34. data/lib/rspec/matchers/test_unit_integration.rb +11 -0
  35. data/spec/rspec/expectations/differ_spec.rb +27 -5
  36. data/spec/rspec/expectations/expectation_target_spec.rb +10 -3
  37. data/spec/rspec/expectations/extensions/kernel_spec.rb +5 -5
  38. data/spec/rspec/expectations/fail_with_spec.rb +19 -0
  39. data/spec/rspec/expectations/handler_spec.rb +42 -21
  40. data/spec/rspec/expectations/syntax_spec.rb +45 -3
  41. data/spec/rspec/matchers/be_close_spec.rb +6 -6
  42. data/spec/rspec/matchers/be_spec.rb +36 -36
  43. data/spec/rspec/matchers/be_within_spec.rb +4 -0
  44. data/spec/rspec/matchers/change_spec.rb +6 -6
  45. data/spec/rspec/matchers/configuration_spec.rb +57 -89
  46. data/spec/rspec/matchers/description_generation_spec.rb +1 -1
  47. data/spec/rspec/matchers/exist_spec.rb +9 -9
  48. data/spec/rspec/matchers/has_spec.rb +1 -1
  49. data/spec/rspec/matchers/have_spec.rb +12 -2
  50. data/spec/rspec/matchers/include_matcher_integration_spec.rb +2 -2
  51. data/spec/rspec/matchers/include_spec.rb +4 -4
  52. data/spec/rspec/matchers/match_array_spec.rb +1 -1
  53. data/spec/rspec/matchers/match_spec.rb +1 -1
  54. data/spec/rspec/matchers/raise_error_spec.rb +189 -99
  55. data/spec/rspec/matchers/respond_to_spec.rb +4 -4
  56. data/spec/rspec/matchers/satisfy_spec.rb +1 -1
  57. data/spec/rspec/matchers/start_with_end_with_spec.rb +2 -2
  58. data/spec/rspec/matchers/yield_spec.rb +81 -4
  59. data/spec/spec_helper.rb +1 -1
  60. metadata +10 -12
@@ -1,3 +1,37 @@
1
+ ### 2.14.0.rc1 / 2013-05-27
2
+ [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.13.0...v2.14.0.rc1)
3
+
4
+ Enhancements
5
+
6
+ * Enhance `yield_control` so that you can specify an exact or relative
7
+ number of times: `expect { }.to yield_control.exactly(3).times`,
8
+ `expect { }.to yield_control.at_least(2).times`, etc (Bartek
9
+ Borkowski).
10
+ * Make the differ that is used when an expectation fails better handle arrays
11
+ by splitting each element of the array onto its own line. (Sam Phippen)
12
+ * Accept duck-typed strings that respond to `:to_str` as expectation messages.
13
+ (Toby Ovod-Everett)
14
+
15
+ Bug fixes
16
+
17
+ * Fix differ to not raise errors when dealing with differently-encoded
18
+ strings (Jon Rowe).
19
+ * Fix `expect(something).to be_within(x).percent_of(y)` where x and y are both
20
+ integers (Sam Phippen).
21
+ * Fix `have` matcher to handle the fact that on ruby 2.0,
22
+ `Enumerator#size` may return nil (Kenta Murata).
23
+ * Fix `expect { raise s }.to raise_error(s)` where s is an error instance
24
+ on ruby 2.0 (Sam Phippen).
25
+ * Fix `expect(object).to raise_error` passing. This now warns the user and
26
+ fails the spec (tomykaira).
27
+
28
+ Deprecations
29
+
30
+ * Deprecate `expect { }.not_to raise_error(SpecificErrorClass)` or
31
+ `expect { }.not_to raise_error("some specific message")`. Using
32
+ these was prone to hiding failures as they would allow _any other
33
+ error_ to pass. (Sam Phippen and David Chelimsky)
34
+
1
35
  ### 2.13.0 / 2013-02-23
2
36
  [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.12.1...v2.13.0)
3
37
 
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  RSpec::Expectations lets you express expected outcomes on an object in an
4
4
  example.
5
5
 
6
- account.balance.should eq(Money.new(37.42, :USD))
6
+ expect(account.balance).to eq(Money.new(37.42, :USD))
7
7
 
8
8
  ## Install
9
9
 
@@ -38,8 +38,7 @@ describe Order do
38
38
  end
39
39
  ```
40
40
 
41
- The `describe` and `it` methods come from rspec-core. The `Order`, `LineItem`,
42
- and `Item` classes would be from _your_ code. The last line of the example
41
+ The `describe` and `it` methods come from rspec-core. The `Order`, `LineItem`, `Item` and `Money` classes would be from _your_ code. The last line of the example
43
42
  expresses an expected outcome. If `order.total == Money.new(5.55, :USD)`, then
44
43
  the example passes. If not, it fails with a message like:
45
44
 
@@ -51,52 +50,50 @@ the example passes. If not, it fails with a message like:
51
50
  ### Equivalence
52
51
 
53
52
  ```ruby
54
- actual.should eq(expected) # passes if actual == expected
55
- actual.should == expected # passes if actual == expected
56
- actual.should eql(expected) # passes if actual.eql?(expected)
53
+ expect(actual).to eq(expected) # passes if actual == expected
54
+ expect(actual).to eql(expected) # passes if actual.eql?(expected)
57
55
  ```
58
56
 
59
- Note: we recommend the `eq` matcher over `==` to avoid Ruby's "== in a
60
- useless context" warning when the `==` matcher is used anywhere but the
61
- last statement of an example.
57
+ Note: The new `expect` syntax no longer supports `==` matcher.
62
58
 
63
59
  ### Identity
64
60
 
65
61
  ```ruby
66
- actual.should be(expected) # passes if actual.equal?(expected)
67
- actual.should equal(expected) # passes if actual.equal?(expected)
62
+ expect(actual).to be(expected) # passes if actual.equal?(expected)
63
+ expect(actual).to equal(expected) # passes if actual.equal?(expected)
68
64
  ```
69
65
 
70
66
  ### Comparisons
71
67
 
72
68
  ```ruby
73
- actual.should be > expected
74
- actual.should be >= expected
75
- actual.should be <= expected
76
- actual.should be < expected
77
- actual.should be_within(delta).of(expected)
69
+ expect(actual).to be > expected
70
+ expect(actual).to be >= expected
71
+ expect(actual).to be <= expected
72
+ expect(actual).to be < expected
73
+ expect(actual).to be_within(delta).of(expected)
78
74
  ```
79
75
 
80
76
  ### Regular expressions
81
77
 
82
78
  ```ruby
83
- actual.should match(/expression/)
84
- actual.should =~ /expression/
79
+ expect(actual).to match(/expression/)
85
80
  ```
86
81
 
82
+ Note: The new `expect` syntax no longer supports `=~` matcher.
83
+
87
84
  ### Types/classes
88
85
 
89
86
  ```ruby
90
- actual.should be_an_instance_of(expected)
91
- actual.should be_a_kind_of(expected)
87
+ expect(actual).to be_an_instance_of(expected)
88
+ expect(actual).to be_a_kind_of(expected)
92
89
  ```
93
90
 
94
91
  ### Truthiness
95
92
 
96
93
  ```ruby
97
- actual.should be_true # passes if actual is truthy (not nil or false)
98
- actual.should be_false # passes if actual is falsy (nil or false)
99
- actual.should be_nil # passes if actual is nil
94
+ expect(actual).to be_true # passes if actual is truthy (not nil or false)
95
+ expect(actual).to be_false # passes if actual is falsy (nil or false)
96
+ expect(actual).to be_nil # passes if actual is nil
100
97
  ```
101
98
 
102
99
  ### Expecting errors
@@ -134,92 +131,51 @@ expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [
134
131
  ### Predicate matchers
135
132
 
136
133
  ```ruby
137
- actual.should be_xxx # passes if actual.xxx?
138
- actual.should have_xxx(:arg) # passes if actual.has_xxx?(:arg)
134
+ expect(actual).to be_xxx # passes if actual.xxx?
135
+ expect(actual).to have_xxx(:arg) # passes if actual.has_xxx?(:arg)
139
136
  ```
140
137
 
141
138
  ### Ranges (Ruby >= 1.9 only)
142
139
 
143
140
  ```ruby
144
- (1..10).should cover(3)
141
+ expect(1..10).to cover(3)
145
142
  ```
146
143
 
147
144
  ### Collection membership
148
145
 
149
146
  ```ruby
150
- actual.should include(expected)
151
- actual.should start_with(expected)
152
- actual.should end_with(expected)
147
+ expect(actual).to include(expected)
148
+ expect(actual).to start_with(expected)
149
+ expect(actual).to end_with(expected)
153
150
  ```
154
151
 
155
152
  #### Examples
156
153
 
157
154
  ```ruby
158
- [1,2,3].should include(1)
159
- [1,2,3].should include(1, 2)
160
- [1,2,3].should start_with(1)
161
- [1,2,3].should start_with(1,2)
162
- [1,2,3].should end_with(3)
163
- [1,2,3].should end_with(2,3)
164
- {:a => 'b'}.should include(:a => 'b')
165
- "this string".should include("is str")
166
- "this string".should start_with("this")
167
- "this string".should end_with("ring")
155
+ expect([1,2,3]).to include(1)
156
+ expect([1,2,3]).to include(1, 2)
157
+ expect([1,2,3]).to start_with(1)
158
+ expect([1,2,3]).to start_with(1,2)
159
+ expect([1,2,3]).to end_with(3)
160
+ expect([1,2,3]).to end_with(2,3)
161
+ expect({:a => 'b'}).to include(:a => 'b')
162
+ expect("this string").to include("is str")
163
+ expect("this string").to start_with("this")
164
+ expect("this string").to end_with("ring")
168
165
  ```
169
166
 
170
- ## `expect` syntax
171
-
172
- In addition to the `should` syntax, rspec-expectations supports
173
- a new `expect` syntax as of version 2.11.0:
174
-
175
- ```ruby
176
- expect(actual).to eq expected
177
- expect(actual).to be > 3
178
- expect([1, 2, 3]).to_not include 4
179
- ```
167
+ ## `should` syntax
180
168
 
181
- If you want your project to only use one of these syntaxes, you can
182
- configure it:
169
+ In addition to the `expect` syntax, rspec-expectations continues to support the
170
+ `should` syntax:
183
171
 
184
172
  ```ruby
185
- RSpec.configure do |config|
186
- config.expect_with :rspec do |c|
187
- c.syntax = :expect
188
- # or
189
- c.syntax = :should
190
- # or
191
- c.syntax = [:should, :expect]
192
- end
193
- end
173
+ actual.should eq expected
174
+ actual.should be > 3
175
+ [1, 2, 3].should_not include 4
194
176
  ```
195
177
 
196
- See
197
- [RSpec::Expectations::Syntax#expect](http://rubydoc.info/gems/rspec-expectations/RSpec/Expectations/Syntax:expect)
198
- for more information.
199
-
200
- ### Motivation for `expect`
201
-
202
- We added the `expect` syntax to resolve some edge case issues, most notably
203
- that objects whose definitions wipe out all but a few methods were throwing
204
- `should` and `should_not` away. `expect` solves that by not monkey patching
205
- those methods onto `Kernel` (or any global object).
206
-
207
- See
208
- [http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax](http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax)
209
- for a detailed explanation.
210
-
211
- ### One-liners
212
-
213
- The one-liner syntax supported by
214
- [rspec-core](http://rubydoc.info/gems/rspec-core) uses `should` even when
215
- `config.syntax = :expect`. It reads better than the alternative, and does not
216
- require a global monkey patch:
217
-
218
- ```ruby
219
- describe User do
220
- it { should validate_presence_of :email }
221
- end
222
- ```
178
+ See [detailed information on the `should` syntax and its usage.](https://github.com/rspec/rspec-expectations/blob/master/Should.md)
223
179
 
224
180
  ## Also see
225
181
 
@@ -2,7 +2,7 @@ rspec-expectations is used to define expected outcomes.
2
2
 
3
3
  describe Account do
4
4
  it "has a balance of zero when first created" do
5
- Account.new.balance.should eq(Money.new(0))
5
+ expect(Account.new.balance).to eq(Money.new(0))
6
6
  end
7
7
  end
8
8
 
@@ -10,17 +10,16 @@ rspec-expectations is used to define expected outcomes.
10
10
 
11
11
  The basic structure of an rspec expectation is:
12
12
 
13
- actual.should matcher(expected)
14
- actual.should_not matcher(expected)
13
+ expect(actual).to matcher(expected)
14
+ expect(actual).not_to matcher(expected)
15
15
 
16
- ## `should` and `should_not`
16
+ Note: You can also use `expect(..).to_not` instead of `expect(..).not_to`.
17
+ One is an alias to the other, so you can use whichever reads better to you.
17
18
 
18
- `rspec-expectations` adds `should` and `should_not` to every object in
19
- the system. These methods each accept a matcher as an argument. This allows
20
- each matcher to work in a positive or negative mode:
19
+ #### Examples
21
20
 
22
- 5.should eq(5)
23
- 5.should_not eq(4)
21
+ expect(5).to eq(5)
22
+ expect(5).not_to eq(4)
24
23
 
25
24
  ## What is a matcher?
26
25
 
@@ -1,55 +1,55 @@
1
1
  # Built-in Matchers
2
2
 
3
- Here is a list of matchers that ship with rspec-expectations. Each matcher
4
- can be used with `should` or `should_not` e.g.
3
+ rspec-expectations ships with a number of built-in matchers.
4
+ Each matcher can be used with `expect(..).to` or `expect(..).not_to` to define
5
+ positive and negative expectations respectively on an object. Most matchers can
6
+ also be accessed using the `(...).should` and `(...).should_not` syntax, see
7
+ [using should syntax](https://github.com/rspec/rspec-expectations/blob/master/Should.md)
8
+ for why we recommend using `expect`.
5
9
 
6
- result.should eq(3)
7
- list.should_not be_empty
10
+ e.g.
11
+
12
+ expect(result).to eq(3)
13
+ expect(list).not_to be_empty
14
+ pi.should be > 3
8
15
 
9
16
  ## Object identity
10
17
 
11
- actual.should be(expected) # passes if actual.equal?(expected)
12
-
18
+ expect(actual).to be(expected) # passes if actual.equal?(expected)
19
+
13
20
  ## Object equivalence
14
21
 
15
- actual.should eq(expected) # passes if actual == expected
22
+ expect(actual).to eq(expected) # passes if actual == expected
16
23
 
17
24
  ## Optional APIs for identity/equivalence
18
25
 
19
- actual.should == expected # passes if actual == expected
20
- actual.should eql(expected) # passes if actual.eql?(expected)
21
- actual.should equal(expected) # passes if actual.equal?(expected)
26
+ expect(actual).to eql(expected) # passes if actual.eql?(expected)
27
+ expect(actual).to equal(expected) # passes if actual.equal?(expected)
22
28
 
23
- # NOTE: this can't work in Ruby 1.8, so we don't support it at all:
24
- # actual.should != expected
25
- # The reason is that Ruby 1.8 parses it as:
26
- # !(actual.should.==(expected)),
27
- # so by the time RSpec sees it it has no way to know that it's
28
- # been negated. Use either of these instead:
29
- # actual.should_not eq(expected)
30
- # actual.should_not == expected
29
+ # NOTE: `expect` does not support `==` matcher.
31
30
 
32
31
  ## Comparisons
33
32
 
34
- actual.should be > expected
35
- actual.should be >= expected
36
- actual.should be <= expected
37
- actual.should be < expected
38
- actual.should =~ /expression/
39
- actual.should match(/expression/)
40
- actual.should be_within(delta).of(expected)
33
+ expect(actual).to be > expected
34
+ expect(actual).to be >= expected
35
+ expect(actual).to be <= expected
36
+ expect(actual).to be < expected
37
+ expect(actual).to match(/expression/)
38
+ expect(actual).to be_within(delta).of(expected)
39
+
40
+ # NOTE: `expect` does not support `=~` matcher.
41
41
 
42
42
  ## Types/classes
43
43
 
44
- actual.should be_instance_of(expected)
45
- actual.should be_kind_of(expected)
44
+ expect(actual).to be_instance_of(expected)
45
+ expect(actual).to be_kind_of(expected)
46
46
 
47
47
  ## Truthiness and existentialism
48
48
 
49
- actual.should be_true # passes if actual is truthy (not nil or false)
50
- actual.should be_false # passes if actual is falsy (nil or false)
51
- actual.should be_nil # passes if actual is nil
52
- actual.should be # passes if actual is truthy (not nil or false)
49
+ expect(actual).to be_true # passes if actual is truthy (not nil or false)
50
+ expect(actual).to be_false # passes if actual is falsy (nil or false)
51
+ expect(actual).to be_nil # passes if actual is nil
52
+ expect(actual).to be # passes if actual is truthy (not nil or false)
53
53
 
54
54
  ## Expecting errors
55
55
 
@@ -66,25 +66,25 @@ can be used with `should` or `should_not` e.g.
66
66
 
67
67
  ## Predicate matchers
68
68
 
69
- actual.should be_xxx # passes if actual.xxx?
70
- actual.should have_xxx(:arg) # passes if actual.has_xxx?(:arg)
69
+ expect(actual).to be_xxx # passes if actual.xxx?
70
+ expect(actual).to have_xxx(:arg) # passes if actual.has_xxx?(:arg)
71
71
 
72
72
  ### Examples
73
73
 
74
- [].should be_empty # passes because [].empty? returns true
75
- { :a => 1 }.should have_key(:a) # passes because the hash has the key :a
74
+ expect([]).to be_empty
75
+ expect(:a => 1).to have_key(:a)
76
76
 
77
77
  ## Collection membership
78
78
 
79
- actual.should include(expected)
79
+ expect(actual).to include(expected)
80
80
 
81
81
  ### Examples
82
82
 
83
- [1,2,3].should include(1)
84
- [1,2,3].should include(1, 2)
85
- {:a => 'b'}.should include(:a => 'b')
86
- "this string".should include("is str")
83
+ expect([1,2,3]).to include(1)
84
+ expect([1,2,3]).to include(1, 2)
85
+ expect(:a => 'b').to include(:a => 'b')
86
+ expect("this string").to include("is str")
87
87
 
88
88
  ## Ranges (1.9 only)
89
89
 
90
- (1..10).should cover(3)
90
+ expect(1..10).to cover(3)
@@ -4,11 +4,11 @@ Feature: be_within matcher
4
4
  Consider this irb session:
5
5
 
6
6
  > radius = 3
7
- => 3
7
+ => 3
8
8
  > area_of_circle = radius * radius * Math::PI
9
- => 28.2743338823081
9
+ => 28.2743338823081
10
10
  > area_of_circle == 28.2743338823081
11
- => false
11
+ => false
12
12
 
13
13
  Instead, you should use the be_within matcher to check that the value
14
14
  is within a delta of your expected value:
@@ -11,14 +11,14 @@ Feature: expect change
11
11
  @count ||= 0
12
12
  @count += 1
13
13
  end
14
-
14
+
15
15
  def count
16
16
  @count ||= 0
17
17
  end
18
18
  end
19
19
  end
20
20
  """
21
-
21
+
22
22
  Scenario: expect change
23
23
  Given a file named "spec/example_spec.rb" with:
24
24
  """ruby
@@ -45,13 +45,13 @@ Feature: expect change
45
45
  require "counter"
46
46
 
47
47
  describe Counter, "#increment" do
48
- it "should not increment the count by 1 (using to_not)" do
49
- expect { Counter.increment }.to_not change{Counter.count}
50
- end
51
-
52
48
  it "should not increment the count by 1 (using not_to)" do
53
49
  expect { Counter.increment }.not_to change{Counter.count}
54
50
  end
51
+
52
+ it "should not increment the count by 1 (using to_not)" do
53
+ expect { Counter.increment }.to_not change{Counter.count}
54
+ end
55
55
  end
56
56
  """
57
57
  When I run `rspec spec/example_spec.rb`