rspec 0.5.16 → 0.6.0
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/CHANGES +12 -0
- data/EXAMPLES.rd +2 -2
- data/examples/custom_method_spec.rb +2 -2
- data/examples/mocking_spec.rb +2 -2
- data/lib/spec/api/helper.rb +0 -6
- data/lib/spec/api/helper/diff.rb +1 -0
- data/lib/spec/api/helper/have_helper.rb +7 -23
- data/lib/spec/api/helper/should_helper.rb +23 -19
- data/lib/spec/api/helper/should_negator.rb +10 -18
- data/lib/spec/api/mocks/argument_expectation.rb +2 -2
- data/lib/spec/api/mocks/message_expectation.rb +28 -53
- data/lib/spec/api/mocks/mock.rb +4 -5
- data/lib/spec/api/sugar.rb +6 -23
- data/lib/spec/runner/instance_exec.rb +11 -5
- data/lib/spec/version.rb +2 -2
- data/test/spec/api/helper/arbitrary_predicate_test.rb +16 -16
- data/test/spec/api/helper/containment_test.rb +16 -16
- data/test/spec/api/helper/identity_test.rb +8 -8
- data/test/spec/api/helper/object_equality_test.rb +13 -13
- data/test/spec/api/helper/raising_test.rb +14 -14
- data/test/spec/api/helper/regex_matching_test.rb +4 -4
- data/test/spec/api/helper/should_have_test.rb +26 -20
- data/test/spec/api/helper/should_satisfy_test.rb +5 -5
- data/test/spec/api/helper/throwing_test.rb +7 -7
- data/test/spec/api/helper/true_false_special_case_test.rb +12 -12
- data/test/spec/api/helper/typing_test.rb +14 -14
- data/test/spec/api/mocks/mock_arg_constraints_test.rb +26 -20
- data/test/spec/api/mocks/mock_counts_test.rb +431 -0
- data/test/spec/api/mocks/mock_ordering_test.rb +61 -42
- data/test/spec/api/mocks/mock_test.rb +68 -230
- data/test/spec/api/sugar_test.rb +1 -1
- data/test/spec/runner/backtrace_tweaker_test.rb +2 -2
- data/test/spec/runner/context_runner_test.rb +4 -4
- data/test/spec/runner/context_test.rb +22 -22
- data/test/spec/runner/execution_context_test.rb +1 -1
- data/test/spec/runner/reporter_test.rb +6 -6
- data/test/spec/runner/specification_test.rb +30 -30
- data/test/test_classes.rb +13 -4
- metadata +6 -11
- data/lib/spec/api/helper/instance_helper.rb +0 -15
- data/lib/spec/api/helper/instance_negator.rb +0 -15
- data/lib/spec/api/helper/kind_helper.rb +0 -15
- data/lib/spec/api/helper/kind_negator.rb +0 -15
- data/lib/spec/api/helper/respond_helper.rb +0 -15
- data/lib/spec/api/helper/respond_negator.rb +0 -15
- data/test/spec/api/duck_type_test.rb +0 -19
data/CHANGES
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
= RSpec Changelog
|
2
2
|
|
3
|
+
== Version 0.6.0
|
4
|
+
This release makes an official commitment to underscore_syntax (with no more support for dot.syntax)
|
5
|
+
|
6
|
+
* Fixed bug (5292) that caused mock argument matching to fail on classes that overrided ==
|
7
|
+
* Converted ALL tests to use underscore syntax
|
8
|
+
* Fixed all remaining problems with underscores revealed by converting all the tests to underscores
|
9
|
+
* Enhanced sugar to support combinations of methods (i.e. once.and_return)
|
10
|
+
* Simplified helper structure taking advantage of dot/underscore combos (i.e. should.be.an_instance_of, which can be expressed as should_be_an_instance_of)
|
11
|
+
* Added support for at_most in mocks
|
12
|
+
* Added support for should_not_receive(:msg) (will be removing should_receive(:msg).never some time soon)
|
13
|
+
* Added support for should_have_exactly(5).items_in_collection
|
14
|
+
|
3
15
|
== Version 0.5.16
|
4
16
|
This release improves Rails support and test2spec translation.
|
5
17
|
|
data/EXAMPLES.rd
CHANGED
@@ -14,8 +14,8 @@
|
|
14
14
|
# An IoProcessor
|
15
15
|
# * should raise nothing when the file is exactly 32 bytes
|
16
16
|
# * should raise an exception when the file length is less than 32 bytes
|
17
|
-
#
|
18
|
-
# * should be able to
|
17
|
+
# A consumer of a mock
|
18
|
+
# * should be able to send messages to the mock
|
19
19
|
# An empty stack
|
20
20
|
# * should accept an item when sent push
|
21
21
|
# * should complain when sent top
|
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../lib/spec'
|
|
3
3
|
context "Rspec allow you to define custom methods" do
|
4
4
|
specify "Rspec should allow you to define methods" do
|
5
5
|
a_method
|
6
|
-
@a_method_called.
|
6
|
+
@a_method_called.should_be true
|
7
7
|
end
|
8
8
|
|
9
9
|
def a_method
|
@@ -15,7 +15,7 @@ require File.dirname(__FILE__) + '/../lib/spec'
|
|
15
15
|
context "Rspec allow you to define custom methods" do
|
16
16
|
specify "Rspec should allow you to define methods" do
|
17
17
|
a_method
|
18
|
-
@a_method_called.
|
18
|
+
@a_method_called.should_be true
|
19
19
|
end
|
20
20
|
|
21
21
|
def a_method
|
data/examples/mocking_spec.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../lib/spec'
|
2
2
|
|
3
|
-
context "
|
3
|
+
context "A consumer of a mock" do
|
4
4
|
|
5
|
-
specify "should be able to
|
5
|
+
specify "should be able to send messages to the mock" do
|
6
6
|
mock = mock("poke me")
|
7
7
|
mock.should_receive(:poke)
|
8
8
|
mock.poke
|
data/lib/spec/api/helper.rb
CHANGED
@@ -1,10 +1,4 @@
|
|
1
1
|
require 'spec/api/helper/should_base'
|
2
2
|
require 'spec/api/helper/have_helper'
|
3
|
-
require 'spec/api/helper/instance_helper'
|
4
|
-
require 'spec/api/helper/instance_negator'
|
5
|
-
require 'spec/api/helper/kind_helper'
|
6
|
-
require 'spec/api/helper/kind_negator'
|
7
|
-
require 'spec/api/helper/respond_helper'
|
8
|
-
require 'spec/api/helper/respond_negator'
|
9
3
|
require 'spec/api/helper/should_helper'
|
10
4
|
require 'spec/api/helper/should_negator'
|
data/lib/spec/api/helper/diff.rb
CHANGED
@@ -2,11 +2,11 @@ module Spec
|
|
2
2
|
|
3
3
|
class HaveHelper < ShouldBase
|
4
4
|
|
5
|
-
def initialize(target, expected=nil)
|
5
|
+
def initialize(target, relativity=:exactly, expected=nil)
|
6
6
|
@target = target
|
7
7
|
@expected = expected == :no ? 0 : expected
|
8
|
-
@
|
9
|
-
@
|
8
|
+
@at_least = (relativity == :at_least)
|
9
|
+
@at_most = (relativity == :at_most)
|
10
10
|
end
|
11
11
|
|
12
12
|
def method_missing(sym, *args)
|
@@ -24,33 +24,17 @@ module Spec
|
|
24
24
|
|
25
25
|
def build_message(sym)
|
26
26
|
message = "<#{@target.class.to_s}> should have"
|
27
|
-
message += " at least" if @
|
28
|
-
message += " at most" if @
|
27
|
+
message += " at least" if @at_least
|
28
|
+
message += " at most" if @at_most
|
29
29
|
message += " #{@expected} #{sym} (has #{actual_size(collection(sym))})"
|
30
30
|
end
|
31
31
|
|
32
32
|
def as_specified?(sym)
|
33
|
-
return actual_size(collection(sym)) >= @expected if @
|
34
|
-
return actual_size(collection(sym)) <= @expected if @
|
33
|
+
return actual_size(collection(sym)) >= @expected if @at_least
|
34
|
+
return actual_size(collection(sym)) <= @expected if @at_most
|
35
35
|
return actual_size(collection(sym)) == @expected
|
36
36
|
end
|
37
37
|
|
38
|
-
def at
|
39
|
-
self
|
40
|
-
end
|
41
|
-
|
42
|
-
def least(min)
|
43
|
-
@expected = min
|
44
|
-
@min = true
|
45
|
-
self
|
46
|
-
end
|
47
|
-
|
48
|
-
def most(max)
|
49
|
-
@expected = max
|
50
|
-
@max = true
|
51
|
-
self
|
52
|
-
end
|
53
|
-
|
54
38
|
end
|
55
39
|
|
56
40
|
end
|
@@ -11,7 +11,19 @@ module Spec
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def have(expected_number=nil)
|
14
|
-
HaveHelper.new(@target, expected_number)
|
14
|
+
HaveHelper.new(@target, :exactly, expected_number)
|
15
|
+
end
|
16
|
+
|
17
|
+
def have_exactly(expected_number=nil)
|
18
|
+
HaveHelper.new(@target, :exactly, expected_number)
|
19
|
+
end
|
20
|
+
|
21
|
+
def have_at_least(expected_number=nil)
|
22
|
+
HaveHelper.new(@target, :at_least, expected_number)
|
23
|
+
end
|
24
|
+
|
25
|
+
def have_at_most(expected_number=nil)
|
26
|
+
HaveHelper.new(@target, :at_most, expected_number)
|
15
27
|
end
|
16
28
|
|
17
29
|
def satisfy(&block)
|
@@ -24,48 +36,40 @@ module Spec
|
|
24
36
|
end
|
25
37
|
|
26
38
|
def be(expected = :___no_arg)
|
39
|
+
@be_seen = true
|
27
40
|
return self if (expected == :___no_arg)
|
28
41
|
return if (expected == false and @target.nil?)
|
29
42
|
return if (expected == true and (!@target.nil?) and (@target != false))
|
30
43
|
fail_with_message(default_message("should be", expected)) unless (@target.equal?(expected))
|
31
44
|
end
|
32
45
|
|
33
|
-
def
|
34
|
-
|
46
|
+
def an_instance_of expected_class
|
47
|
+
fail_with_message(default_message("should be an instance of", expected_class)) unless @target.instance_of? expected_class
|
35
48
|
end
|
36
49
|
|
37
|
-
|
38
|
-
|
39
|
-
def instance
|
40
|
-
InstanceHelper.new(@target)
|
41
|
-
end
|
42
|
-
|
43
|
-
def kind
|
44
|
-
KindHelper.new(@target)
|
50
|
+
def a_kind_of expected_class
|
51
|
+
fail_with_message(default_message("should be a kind of", expected_class)) unless @target.kind_of? expected_class
|
45
52
|
end
|
46
53
|
|
47
|
-
def
|
48
|
-
|
54
|
+
def respond_to message
|
55
|
+
fail_with_message(default_message("should respond to", message)) unless @target.respond_to? message
|
49
56
|
end
|
50
57
|
|
51
58
|
def method_missing(sym, *args)
|
52
59
|
return if @target.send("#{sym}?", *args)
|
53
|
-
fail_with_message(default_message("should be #{sym}" + (args.empty? ? '' : (' ' + args.join(', ')))))
|
60
|
+
fail_with_message(default_message("should be #{sym}" + (args.empty? ? '' : (' ' + args.join(', '))))) if @be_seen
|
61
|
+
fail_with_message(default_message("should #{sym}" + (args.empty? ? '' : (' ' + args.join(', '))))) unless @be_seen
|
54
62
|
end
|
55
63
|
|
56
64
|
def match(expected)
|
57
65
|
fail_with_message(default_message("should match", expected)) unless (@target =~ expected)
|
58
66
|
end
|
59
67
|
|
60
|
-
def include(sub)
|
61
|
-
fail_with_message(default_message("should include", sub)) unless (@target.include? sub)
|
62
|
-
end
|
63
|
-
|
64
68
|
def raise(exception=Exception, message=nil)
|
65
69
|
begin
|
66
70
|
@target.call
|
67
71
|
rescue exception => e
|
68
|
-
e.message.
|
72
|
+
e.message.should_equal message unless message.nil?
|
69
73
|
return
|
70
74
|
rescue => e
|
71
75
|
fail_with_message("#{default_message("should raise", exception)} but raised #{e.inspect}")
|
@@ -15,36 +15,27 @@ module Spec
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def be(expected = :no_arg)
|
18
|
+
@be_seen = true
|
18
19
|
return self if (expected == :no_arg)
|
19
20
|
fail_with_message(default_message("should not be", expected)) if (@target.equal?(expected))
|
20
21
|
end
|
21
22
|
|
22
|
-
def
|
23
|
-
|
23
|
+
def an_instance_of expected_class
|
24
|
+
fail_with_message(default_message("should not be an instance of", expected_class)) if @target.instance_of? expected_class
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
def instance
|
29
|
-
InstanceNegator.new(@target)
|
30
|
-
end
|
31
|
-
|
32
|
-
def kind
|
33
|
-
KindNegator.new(@target)
|
27
|
+
def a_kind_of expected_class
|
28
|
+
fail_with_message(default_message("should not be a kind of", expected_class)) if @target.kind_of? expected_class
|
34
29
|
end
|
35
30
|
|
36
|
-
|
37
|
-
|
38
|
-
|
31
|
+
def respond_to message
|
32
|
+
fail_with_message(default_message("should not respond to", message)) if @target.respond_to? message
|
33
|
+
end
|
39
34
|
|
40
35
|
def match(expected)
|
41
36
|
fail_with_message(default_message("should not match", expected)) if (@target =~ expected)
|
42
37
|
end
|
43
38
|
|
44
|
-
def include(sub)
|
45
|
-
fail_with_message(default_message("should not include", sub)) if (@target.include? sub)
|
46
|
-
end
|
47
|
-
|
48
39
|
def raise(exception=Exception, message=nil)
|
49
40
|
begin
|
50
41
|
@target.call
|
@@ -71,7 +62,8 @@ module Spec
|
|
71
62
|
|
72
63
|
def method_missing(sym, *args)
|
73
64
|
return unless @target.send("#{sym}?", *args)
|
74
|
-
fail_with_message(default_message("should not
|
65
|
+
fail_with_message(default_message("should not #{sym}" + (args.empty? ? '' : (' ' + args.join(', '))))) unless @be_seen
|
66
|
+
fail_with_message(default_message("should not be #{sym}" + (args.empty? ? '' : (' ' + args.join(', '))))) if @be_seen
|
75
67
|
end
|
76
68
|
|
77
69
|
end
|
@@ -68,8 +68,8 @@ module Spec
|
|
68
68
|
@@constraint_classes[:string] = StringArgConstraint
|
69
69
|
|
70
70
|
def initialize(args)
|
71
|
-
if
|
72
|
-
elsif
|
71
|
+
if [:any_args] == args then @expected_params = nil
|
72
|
+
elsif [:no_args] == args then @expected_params = []
|
73
73
|
else @expected_params = process_arg_constraints(args)
|
74
74
|
end
|
75
75
|
end
|
@@ -16,9 +16,6 @@ module Spec
|
|
16
16
|
@consecutive = false
|
17
17
|
@exception_to_raise = nil
|
18
18
|
@symbol_to_throw = nil
|
19
|
-
@any_seen = false
|
20
|
-
@at_seen = false
|
21
|
-
@and_seen = false
|
22
19
|
@ordering = expectation_ordering
|
23
20
|
@ordered = false
|
24
21
|
end
|
@@ -45,7 +42,8 @@ module Spec
|
|
45
42
|
# Error msg should tell exactly what went wrong. (AH).
|
46
43
|
|
47
44
|
return if @expected_received_count == :any
|
48
|
-
return if (@
|
45
|
+
return if (@at_least) && (@received_count >= @expected_received_count)
|
46
|
+
return if (@at_most) && (@received_count <= @expected_received_count)
|
49
47
|
return if @expected_received_count == @received_count
|
50
48
|
|
51
49
|
count_message = make_count_message(@expected_received_count)
|
@@ -122,49 +120,40 @@ module Spec
|
|
122
120
|
self
|
123
121
|
end
|
124
122
|
|
125
|
-
def at
|
126
|
-
@at_seen = true
|
127
|
-
self
|
128
|
-
end
|
129
|
-
|
130
123
|
def exactly(n)
|
131
|
-
|
124
|
+
set_expected_received_count :exactly, n
|
132
125
|
self
|
133
126
|
end
|
134
127
|
|
135
|
-
def
|
136
|
-
|
137
|
-
@expected_received_count = -1 if arg == :once
|
138
|
-
@expected_received_count = -2 if arg == :twice
|
139
|
-
@expected_received_count = -arg if arg.kind_of? Numeric
|
140
|
-
end
|
141
|
-
@at_seen = false
|
142
|
-
self
|
143
|
-
end
|
144
|
-
|
145
|
-
def any
|
146
|
-
@any_seen = true
|
128
|
+
def at_least(n)
|
129
|
+
set_expected_received_count :at_least, n
|
147
130
|
self
|
148
131
|
end
|
149
132
|
|
150
|
-
def
|
151
|
-
|
152
|
-
@any_seen = false
|
133
|
+
def at_most(n)
|
134
|
+
set_expected_received_count :at_most, n
|
153
135
|
self
|
154
136
|
end
|
155
137
|
|
156
|
-
def
|
157
|
-
@
|
158
|
-
@
|
159
|
-
|
138
|
+
def set_expected_received_count relativity, n
|
139
|
+
@at_least = (relativity == :at_least)
|
140
|
+
@at_most = (relativity == :at_most)
|
141
|
+
@expected_received_count = 1 if n == :once
|
142
|
+
@expected_received_count = 2 if n == :twice
|
143
|
+
@expected_received_count = n if n.kind_of? Numeric
|
160
144
|
end
|
161
|
-
|
145
|
+
|
162
146
|
def times
|
163
|
-
|
164
|
-
@of_seen = false
|
147
|
+
#pure sugar
|
165
148
|
self
|
166
149
|
end
|
167
150
|
|
151
|
+
def any_number_of_times
|
152
|
+
@expected_received_count = :any
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
#TODO - replace this w/ not syntax in mock
|
168
157
|
def never
|
169
158
|
@expected_received_count = 0
|
170
159
|
self
|
@@ -180,43 +169,29 @@ module Spec
|
|
180
169
|
self
|
181
170
|
end
|
182
171
|
|
183
|
-
def
|
184
|
-
@and_seen = true
|
185
|
-
self
|
186
|
-
end
|
187
|
-
|
188
|
-
def return(value=nil, &return_block)
|
172
|
+
def and_return(value=nil, &return_block)
|
189
173
|
Kernel::raise AmbiguousReturnError unless @method_block.nil?
|
190
|
-
return self unless @and_seen
|
191
|
-
@and_seen = false
|
192
174
|
@consecutive = value.instance_of? Array
|
193
175
|
@return_block = block_given? ? return_block : lambda { value }
|
194
176
|
end
|
195
177
|
|
196
|
-
def
|
197
|
-
return self unless @and_seen
|
198
|
-
@and_seen = false
|
178
|
+
def and_raise(exception=Exception)
|
199
179
|
@exception_to_raise = exception
|
200
180
|
end
|
201
181
|
|
202
|
-
def
|
203
|
-
return self unless @and_seen
|
204
|
-
@and_seen = false
|
182
|
+
def and_throw(symbol)
|
205
183
|
@symbol_to_throw = symbol
|
206
184
|
end
|
207
185
|
|
186
|
+
def and_yield(*args)
|
187
|
+
@args_to_yield = args
|
188
|
+
end
|
189
|
+
|
208
190
|
def ordered
|
209
191
|
@ordering.register(self)
|
210
192
|
@ordered = true
|
211
193
|
self
|
212
194
|
end
|
213
|
-
|
214
|
-
def yield(*args)
|
215
|
-
return self unless @and_seen
|
216
|
-
@and_seen = false
|
217
|
-
@args_to_yield = args
|
218
|
-
end
|
219
|
-
|
220
195
|
end
|
221
196
|
end
|
222
197
|
end
|
data/lib/spec/api/mocks/mock.rb
CHANGED
@@ -16,16 +16,15 @@ module Spec
|
|
16
16
|
@expectation_ordering = OrderGroup.new
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
self
|
21
|
-
end
|
22
|
-
|
23
|
-
def receive(sym, &block)
|
19
|
+
def should_receive(sym, &block)
|
24
20
|
expected_from = caller(1)[0]
|
25
21
|
expectation = MessageExpectation.new(@name, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
26
22
|
@expectations << expectation
|
27
23
|
expectation
|
28
24
|
end
|
25
|
+
|
26
|
+
def should_not_receive(sym, &block)
|
27
|
+
end
|
29
28
|
|
30
29
|
def __verify #:nodoc:
|
31
30
|
@expectations.each do |expectation|
|
data/lib/spec/api/sugar.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Spec
|
2
2
|
module Api
|
3
3
|
# This module adds syntactic sugar that allows usage of should_* instead of should.*
|
4
|
-
module
|
4
|
+
module UnderscoreSugar
|
5
5
|
module SugarizeForRspec; end
|
6
6
|
|
7
7
|
def sugarize_for_rspec!
|
8
8
|
original_method_missing = instance_method(:method_missing)
|
9
9
|
class_eval do
|
10
|
-
include SugarizeForRspec # This is meant to add a
|
10
|
+
include SugarizeForRspec # This is meant to add a signature to the object that sugarization occurred.
|
11
11
|
def method_missing(sym, *args, &block)
|
12
12
|
_method_missing(sym, args, block)
|
13
13
|
end
|
@@ -18,9 +18,10 @@ module Spec
|
|
18
18
|
object = self
|
19
19
|
calls = sym.to_s.split("_")
|
20
20
|
while calls.length > 1
|
21
|
+
break if (object.respond_to?calls.join("_"))
|
21
22
|
call = calls.shift
|
22
23
|
object = object.__send__(call)
|
23
|
-
break if call == "be"
|
24
|
+
break if call == "be"
|
24
25
|
end
|
25
26
|
return object.__send__(calls.join("_"), *args, &block)
|
26
27
|
end
|
@@ -31,29 +32,11 @@ module Spec
|
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
34
|
-
|
35
|
-
module MessageExpectationSugar
|
36
|
-
def __is_sweetened?(sym) #:nodoc:
|
37
|
-
return true if sym.to_s =~ /^and_|^at_|^any_|^once_/
|
38
|
-
end
|
39
|
-
end
|
40
35
|
end
|
41
36
|
end
|
42
37
|
|
43
38
|
class Module
|
44
|
-
include Spec::Api::
|
45
|
-
end
|
46
|
-
|
47
|
-
Object.sugarize_for_rspec!
|
48
|
-
|
49
|
-
class Spec::Api::Mock #:nodoc:
|
50
|
-
# NOTE: this resolves a bug caused by a conflict between Sugar#method_missing and Mock#method_missing, specifically
|
51
|
-
# when the mock is set null_object=>true. It would be nice to get rid of this.
|
52
|
-
def should_receive(sym, &block)
|
53
|
-
return receive(sym, &block)
|
54
|
-
end
|
39
|
+
include Spec::Api::UnderscoreSugar
|
55
40
|
end
|
56
41
|
|
57
|
-
|
58
|
-
include Spec::Api::MessageExpectationSugar
|
59
|
-
end
|
42
|
+
Object.sugarize_for_rspec!
|