caricature 0.7.0 → 0.7.1
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/README.rdoc +9 -9
- data/Rakefile +2 -3
- data/caricature.gemspec +6 -11
- data/lib/caricature.rb +2 -1
- data/lib/caricature/bacon.rb +2 -0
- data/lib/caricature/bacon/integration.rb +57 -0
- data/lib/caricature/clr/isolation.rb +11 -10
- data/lib/caricature/clr/messenger.rb +8 -5
- data/lib/caricature/expectation.rb +56 -11
- data/lib/caricature/isolation.rb +2 -9
- data/lib/caricature/isolator.rb +3 -3
- data/lib/caricature/messenger.rb +14 -4
- data/lib/caricature/method_call_recorder.rb +78 -12
- data/lib/caricature/rspec.rb +0 -0
- data/lib/caricature/rspec/integration.rb +0 -0
- data/lib/caricature/verification.rb +11 -2
- data/lib/caricature/version.rb +1 -1
- data/spec/integration/callback_spec.rb +1 -1
- data/spec/integration/clr_to_clr_spec.rb +1 -0
- data/spec/unit/expectation_spec.rb +73 -1
- data/spec/unit/messaging_spec.rb +139 -0
- data/spec/unit/method_call_spec.rb +66 -18
- data/spec/unit/verification_spec.rb +1 -1
- metadata +7 -5
- data/spec/bin/ClrModels.dll.mdb +0 -0
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Caricature - Bringing simple mocking to the DLR
|
2
2
|
|
3
|
-
* http://github.com
|
3
|
+
* http://github.com/casualjim/caricature
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
@@ -33,25 +33,25 @@ problems but for the time being this is how it has to be.
|
|
33
33
|
|
34
34
|
isolation = Isolation.for(Ninja)
|
35
35
|
isolation.when_receiving(:attack) do |exp|
|
36
|
-
|
37
|
-
|
36
|
+
exp.with(:shuriken)
|
37
|
+
exp.return(3)
|
38
38
|
end
|
39
39
|
|
40
|
-
Battle.new(mock)
|
41
|
-
battle.combat
|
40
|
+
Battle.new(mock)
|
41
|
+
battle.combat
|
42
42
|
|
43
|
-
isolation.
|
43
|
+
isolation.should.have_received?(:attack)
|
44
44
|
|
45
45
|
|
46
46
|
== REQUIREMENTS:
|
47
47
|
|
48
48
|
* To use the caricature library you need to have uuidtools installed
|
49
|
-
sudo gem install uuidtools
|
50
|
-
sudo igem install uuidtools
|
49
|
+
(sudo) gem install uuidtools
|
50
|
+
(sudo) igem install uuidtools
|
51
51
|
|
52
52
|
== INSTALL:
|
53
53
|
|
54
|
-
sudo gem install caricature
|
54
|
+
(sudo) gem install caricature
|
55
55
|
|
56
56
|
== LICENSE:
|
57
57
|
|
data/Rakefile
CHANGED
@@ -59,9 +59,8 @@ SUMMARY = "Caricature brings simple mocking to Ruby, DLR and CLR."
|
|
59
59
|
RDOC_OPTIONS = [
|
60
60
|
"--quiet",
|
61
61
|
"--title", SUMMARY,
|
62
|
-
"--main", "
|
62
|
+
"--main", "README.rdoc",
|
63
63
|
"--line-numbers",
|
64
|
-
"--inline-source",
|
65
64
|
"--format","darkfish"
|
66
65
|
]
|
67
66
|
|
@@ -132,7 +131,7 @@ begin
|
|
132
131
|
s.extra_rdoc_files = RDOC_FILES
|
133
132
|
s.rdoc_options = RDOC_OPTIONS
|
134
133
|
s.required_ruby_version = ">= 1.8.4"
|
135
|
-
s.
|
134
|
+
s.add_dependency 'uuidtools', ">= 2.0.0"
|
136
135
|
end
|
137
136
|
|
138
137
|
Rake::GemPackageTask.new(spec) do |pkg|
|
data/caricature.gemspec
CHANGED
@@ -11,9 +11,9 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.files = ["README.rdoc",
|
12
12
|
"Rakefile",
|
13
13
|
"caricature.gemspec",
|
14
|
-
"lib/caricature",
|
15
14
|
"lib/caricature.rb",
|
16
|
-
"lib/caricature/
|
15
|
+
"lib/caricature/bacon.rb",
|
16
|
+
"lib/caricature/bacon/integration.rb",
|
17
17
|
"lib/caricature/clr.rb",
|
18
18
|
"lib/caricature/clr/aspnet_mvc.rb",
|
19
19
|
"lib/caricature/clr/descriptor.rb",
|
@@ -26,9 +26,10 @@ Gem::Specification.new do |s|
|
|
26
26
|
"lib/caricature/isolator.rb",
|
27
27
|
"lib/caricature/messenger.rb",
|
28
28
|
"lib/caricature/method_call_recorder.rb",
|
29
|
+
"lib/caricature/rspec.rb",
|
30
|
+
"lib/caricature/rspec/integration.rb",
|
29
31
|
"lib/caricature/verification.rb",
|
30
32
|
"lib/caricature/version.rb",
|
31
|
-
"lib/core_ext",
|
32
33
|
"lib/core_ext/array.rb",
|
33
34
|
"lib/core_ext/class.rb",
|
34
35
|
"lib/core_ext/core_ext.rb",
|
@@ -36,22 +37,16 @@ Gem::Specification.new do |s|
|
|
36
37
|
"lib/core_ext/module.rb",
|
37
38
|
"lib/core_ext/object.rb",
|
38
39
|
"lib/core_ext/string.rb",
|
39
|
-
"lib/core_ext/system",
|
40
40
|
"lib/core_ext/system/string.rb",
|
41
41
|
"lib/core_ext/system/type.rb",
|
42
42
|
"spec/bacon_helper.rb",
|
43
|
-
"spec/bin",
|
44
43
|
"spec/bin/ClrModels.dll",
|
45
|
-
"spec/bin/ClrModels.dll.mdb",
|
46
|
-
"spec/integration",
|
47
44
|
"spec/integration/callback_spec.rb",
|
48
45
|
"spec/integration/clr_to_clr_spec.rb",
|
49
46
|
"spec/integration/clr_to_ruby_spec.rb",
|
50
47
|
"spec/integration/indexer_spec.rb",
|
51
48
|
"spec/integration/ruby_to_ruby_spec.rb",
|
52
|
-
"spec/models",
|
53
49
|
"spec/models/ClrModels.cs",
|
54
|
-
"spec/unit",
|
55
50
|
"spec/unit/core_ext_spec.rb",
|
56
51
|
"spec/unit/descriptor_spec.rb",
|
57
52
|
"spec/unit/expectation_spec.rb",
|
@@ -67,7 +62,7 @@ Gem::Specification.new do |s|
|
|
67
62
|
s.loaded = false
|
68
63
|
s.name = "caricature"
|
69
64
|
s.platform = "ruby"
|
70
|
-
s.rdoc_options = ["--quiet", "--title", "Caricature brings simple mocking to Ruby, DLR and CLR.", "--main", "
|
65
|
+
s.rdoc_options = ["--quiet", "--title", "Caricature brings simple mocking to Ruby, DLR and CLR.", "--main", "README.rdoc", "--line-numbers", "--format", "darkfish"]
|
71
66
|
s.require_paths = ["lib"]
|
72
67
|
s.required_ruby_version = ">= 1.8.4"
|
73
68
|
s.required_rubygems_version = ">= 0"
|
@@ -75,5 +70,5 @@ Gem::Specification.new do |s|
|
|
75
70
|
s.rubygems_version = "1.3.5"
|
76
71
|
s.specification_version = 3
|
77
72
|
s.summary = "Caricature brings simple mocking to Ruby, DLR and CLR."
|
78
|
-
s.version = "0.7.
|
73
|
+
s.version = "0.7.1"
|
79
74
|
end
|
data/lib/caricature.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
class Should
|
2
|
+
|
3
|
+
def have_received?(name, &b)
|
4
|
+
lambda { |obj, *args| obj.did_receive?(name, &b).successful? }
|
5
|
+
end
|
6
|
+
|
7
|
+
def satisfy(*args, &block)
|
8
|
+
if args.size == 1 && String === args.first
|
9
|
+
description = args.shift
|
10
|
+
else
|
11
|
+
description = ""
|
12
|
+
end
|
13
|
+
|
14
|
+
r=nil
|
15
|
+
err = nil
|
16
|
+
begin
|
17
|
+
r = yield(@object, *args)
|
18
|
+
rescue Caricature::ArgumentMatchError => e
|
19
|
+
err =e
|
20
|
+
end
|
21
|
+
if Bacon::Counter[:depth] > 0
|
22
|
+
Bacon::Counter[:requirements] += 1
|
23
|
+
raise (err.is_a?(Caricature::ArgumentMatchError) ? err : Bacon::Error.new(:failed, description)) unless @negated ^ r
|
24
|
+
r
|
25
|
+
else
|
26
|
+
@negated ? !r : !!r
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
module Caricature
|
33
|
+
|
34
|
+
# Describes a verification of a method call.
|
35
|
+
# This corresponds kind of to an assertion
|
36
|
+
class Verification
|
37
|
+
|
38
|
+
|
39
|
+
# indicate that this method verification is successful
|
40
|
+
def successful?
|
41
|
+
a = any_args? ? [:any] : @args
|
42
|
+
begin
|
43
|
+
return @recorder.was_called?(@method_name, @block_args, @mode, *a)
|
44
|
+
rescue ArgumentError => e
|
45
|
+
raise Caricature::ArgumentMatchError.new :failed, e
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class ArgumentMatchError < Bacon::Error;
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -2,15 +2,6 @@ module Caricature
|
|
2
2
|
|
3
3
|
class Isolation
|
4
4
|
|
5
|
-
def internal_create_override(method_name, mode=:instance, &block)
|
6
|
-
builder = ExpectationBuilder.new method_name
|
7
|
-
block.call builder unless block.nil?
|
8
|
-
exp = builder.build
|
9
|
-
|
10
|
-
expectations.add_expectation exp, mode
|
11
|
-
exp
|
12
|
-
end
|
13
|
-
|
14
5
|
class << self
|
15
6
|
|
16
7
|
# Creates an isolation object complete with proxy and method call recorder
|
@@ -34,8 +25,18 @@ module Caricature
|
|
34
25
|
return ClrInterfaceIsolator if subject.respond_to? :class_eval and !subject.respond_to? :new
|
35
26
|
ClrIsolator
|
36
27
|
end
|
37
|
-
end
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
38
31
|
|
32
|
+
def internal_create_override(method_name, mode=:instance, &block)
|
33
|
+
builder = ExpectationBuilder.new method_name
|
34
|
+
block.call builder unless block.nil?
|
35
|
+
exp = builder.build
|
36
|
+
|
37
|
+
expectations.add_expectation exp, mode
|
38
|
+
exp
|
39
|
+
end
|
39
40
|
|
40
41
|
end
|
41
42
|
|
@@ -7,13 +7,15 @@ module Caricature
|
|
7
7
|
|
8
8
|
# deliver the message to the receiving isolation
|
9
9
|
def internal_deliver(mode, method_name, return_type, *args, &b)
|
10
|
-
exp = expectations.find(method_name, mode, *args)
|
10
|
+
exp = expectations.find(method_name, mode, *args)
|
11
|
+
bl = record_call(method_name, mode, exp, *args, &b)
|
11
12
|
is_value_type = return_type && return_type != System::Void.to_clr_type && return_type.is_value_type
|
12
13
|
res = nil
|
13
14
|
if exp
|
14
|
-
|
15
|
-
res =
|
16
|
-
res =
|
15
|
+
block = exp.block || b
|
16
|
+
res = instance.__send__(method_name, *args, &block) if exp.super_before?
|
17
|
+
res = exp.execute *args, &bl
|
18
|
+
res = instance.__send__(method_name, *args, &block) if !exp.super_before? and exp.call_super?
|
17
19
|
end
|
18
20
|
res ||= System::Activator.create_instance(return_type) if is_value_type
|
19
21
|
res
|
@@ -31,7 +33,8 @@ module Caricature
|
|
31
33
|
res = nil
|
32
34
|
is_value_type = return_type && return_type != System::Void.to_clr_type && return_type.is_value_type
|
33
35
|
exp = expectations.find(method_name, mode, *args)
|
34
|
-
|
36
|
+
bl = record_call(method_name, mode, exp, *args, &b)
|
37
|
+
res = exp.execute *args, &bl if exp
|
35
38
|
res ||= System::Activator.create_instance(return_type) if is_value_type
|
36
39
|
res
|
37
40
|
end
|
@@ -47,9 +47,17 @@ module Caricature
|
|
47
47
|
|
48
48
|
# tell the expectation it nees to return this value or the value returned by the block
|
49
49
|
# you provide to this method.
|
50
|
-
def return(value=nil)
|
50
|
+
def return(value=nil, &b)
|
51
51
|
@return_value = value
|
52
|
-
@
|
52
|
+
@return_callback = b if b
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
# Sets up arguments for the block that is being passed into the isolated method call
|
57
|
+
def pass_block(*args, &b)
|
58
|
+
@any_block_args = args.first.is_a?(Symbol) and args.first == :any
|
59
|
+
@block_args = args
|
60
|
+
@block_callback = b unless b.nil?
|
53
61
|
self
|
54
62
|
end
|
55
63
|
|
@@ -61,13 +69,17 @@ module Caricature
|
|
61
69
|
end
|
62
70
|
|
63
71
|
# tell the expecation it needs to call the super before the expectation exectution
|
64
|
-
def super_before
|
72
|
+
def super_before(&b)
|
65
73
|
@super = :before
|
74
|
+
@block = b if b
|
75
|
+
self
|
66
76
|
end
|
67
77
|
|
68
78
|
# tell the expectation it needs to call the super after the expecation execution
|
69
|
-
def super_after
|
79
|
+
def super_after(&b)
|
70
80
|
@super = :after
|
81
|
+
@block = b if b
|
82
|
+
self
|
71
83
|
end
|
72
84
|
|
73
85
|
# indicates whether this expectation should match with any arguments
|
@@ -101,10 +113,24 @@ module Caricature
|
|
101
113
|
# contains the callback if one is given
|
102
114
|
attr_reader :callback
|
103
115
|
|
116
|
+
# contains the callback that is used to return the value when this expectation
|
117
|
+
# is executed
|
118
|
+
attr_reader :return_callback
|
119
|
+
|
120
|
+
# contains the arguments that will be passed on to the block
|
121
|
+
attr_reader :block_args
|
122
|
+
|
123
|
+
# The block that will be used as value provider for the block in the method
|
124
|
+
attr_reader :block_callback
|
125
|
+
|
126
|
+
# the block that will be used
|
127
|
+
attr_accessor :block
|
128
|
+
|
129
|
+
|
104
130
|
# Initializes a new instance of an expectation
|
105
|
-
def initialize(
|
106
|
-
@method_name, @args, @error_args, @return_value, @
|
107
|
-
|
131
|
+
def initialize(*args)
|
132
|
+
@method_name, @args, @error_args, @return_value, @return_callback,
|
133
|
+
@super, @callback, @block_args, @block_callback, @block = *args
|
108
134
|
@any_args = true
|
109
135
|
end
|
110
136
|
|
@@ -132,12 +158,32 @@ module Caricature
|
|
132
158
|
def has_callback?
|
133
159
|
!@callback.nil?
|
134
160
|
end
|
161
|
+
|
162
|
+
# indicates whether this expectation has a block as value provider for the method call block
|
163
|
+
def has_block_callback?
|
164
|
+
!@block_callback.nil?
|
165
|
+
end
|
166
|
+
|
167
|
+
# a flag to indicate it has a return value callback
|
168
|
+
def has_return_callback?
|
169
|
+
!@return_callback.nil?
|
170
|
+
end
|
135
171
|
|
136
172
|
# executes this expectation with its configuration
|
137
|
-
def execute(*margs)
|
173
|
+
def execute(*margs,&b)
|
138
174
|
ags = any_args? ? (margs.empty? ? :any : margs) : args
|
139
175
|
actual_raise *@error_args if has_error_args?
|
140
176
|
callback.call(*ags) if has_callback?
|
177
|
+
|
178
|
+
if b
|
179
|
+
if has_block_callback?
|
180
|
+
b.call(*@block_callback.call)
|
181
|
+
else
|
182
|
+
b.call(*@block_args)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
return @return_callback.call(*margs) if has_return_callback?
|
141
187
|
return return_value if has_return_value?
|
142
188
|
nil
|
143
189
|
end
|
@@ -161,15 +207,14 @@ module Caricature
|
|
161
207
|
# this builder is passed into the block to allow only certain
|
162
208
|
# operations in the block.
|
163
209
|
def initialize(method_name)
|
164
|
-
@method_name, @
|
165
|
-
method_name, nil, nil, nil, nil, [], true, nil
|
210
|
+
@method_name, @args, @any_args = method_name, [], true
|
166
211
|
end
|
167
212
|
|
168
213
|
|
169
214
|
|
170
215
|
# build up the expectation with the provided arguments
|
171
216
|
def build
|
172
|
-
Expectation.new @method_name, @args, @error_args, @return_value, @super, @callback
|
217
|
+
Expectation.new @method_name, @args, @error_args, @return_value, @return_callback, @super, @callback, @block_args, @block_callback, @block
|
173
218
|
end
|
174
219
|
|
175
220
|
end
|
data/lib/caricature/isolation.rb
CHANGED
@@ -64,9 +64,9 @@ module Caricature
|
|
64
64
|
# Initializes a new instance of this isolation.
|
65
65
|
def initialize(isolator, context)
|
66
66
|
@instance = isolator.subject
|
67
|
-
@recorder = context.recorder
|
68
67
|
@messenger = context.messenger
|
69
|
-
@
|
68
|
+
@messenger.recorder = @recorder = context.recorder
|
69
|
+
@expectations = context.expectations
|
70
70
|
@proxy = isolator.isolation
|
71
71
|
isolator.isolation.class.instance_variable_set("@___context___", self)
|
72
72
|
end
|
@@ -74,14 +74,12 @@ module Caricature
|
|
74
74
|
# record and send the message to the isolation.
|
75
75
|
# takes care of following expectations rules when sending messages.
|
76
76
|
def send_message(method_name, return_type, *args, &b)
|
77
|
-
recorder.record_call method_name, :instance, *args, &b
|
78
77
|
@messenger.deliver(method_name, return_type, *args, &b)
|
79
78
|
end
|
80
79
|
|
81
80
|
# record and send the message to the isolation.
|
82
81
|
# takes care of following expectations rules when sending messages.
|
83
82
|
def send_class_message(method_name, return_type, *args, &b)
|
84
|
-
recorder.record_call method_name, :class, *args, &b
|
85
83
|
@messenger.deliver_to_class(method_name, return_type, *args, &b)
|
86
84
|
end
|
87
85
|
|
@@ -126,11 +124,6 @@ module Caricature
|
|
126
124
|
builder = ExpectationBuilder.new method_name
|
127
125
|
block.call builder unless block.nil?
|
128
126
|
exp = builder.build
|
129
|
-
@proxy.class.send((mode == :instance ? :define_method : :define_cmethod), method_name.to_sym, lambda do |*args|
|
130
|
-
b = nil
|
131
|
-
b = Proc.new { yield } if block_given?
|
132
|
-
isolation_context.send_message(method_name, nil, *args, &b)
|
133
|
-
end)
|
134
127
|
expectations.add_expectation exp, mode
|
135
128
|
exp
|
136
129
|
end
|
data/lib/caricature/isolator.rb
CHANGED
@@ -56,7 +56,7 @@ module Caricature
|
|
56
56
|
# You will probably be using this method only when you're interested in whether a method has been called
|
57
57
|
# during the course of the test you're running.
|
58
58
|
def did_receive?(method_name, &block)
|
59
|
-
isolation_context.class_verify method_name
|
59
|
+
isolation_context.class_verify method_name, &block
|
60
60
|
end
|
61
61
|
|
62
62
|
end
|
@@ -129,7 +129,7 @@ module Caricature
|
|
129
129
|
# You will probably be using this method only when you're interested in whether a method has been called
|
130
130
|
# during the course of the test you're running.
|
131
131
|
def did_receive?(method_name, &block)
|
132
|
-
isolation_context.verify method_name
|
132
|
+
isolation_context.verify method_name, &block
|
133
133
|
end
|
134
134
|
|
135
135
|
# Verifies whether the specified class method has been called
|
@@ -158,7 +158,7 @@ module Caricature
|
|
158
158
|
# It expects the constructor parameters if they are needed.
|
159
159
|
def with_subject(*args, &b)
|
160
160
|
isolation_context.instance = self.class.superclass.new *args
|
161
|
-
|
161
|
+
b.call self if b
|
162
162
|
self
|
163
163
|
end
|
164
164
|
|
data/lib/caricature/messenger.rb
CHANGED
@@ -3,6 +3,9 @@ module Caricature
|
|
3
3
|
# A base class to encapsulate method invocation
|
4
4
|
class Messenger
|
5
5
|
|
6
|
+
# contains the recorder for recording method calls
|
7
|
+
attr_accessor :recorder
|
8
|
+
|
6
9
|
# the real instance of the isolated subject
|
7
10
|
# used to forward calls in partial mocks
|
8
11
|
attr_reader :instance
|
@@ -32,6 +35,11 @@ module Caricature
|
|
32
35
|
def internal_deliver(mode, method_name, return_type, *args, &b)
|
33
36
|
raise NotImplementedError.new("Override in an implementing class")
|
34
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
def record_call(method_name, mode, expectation, *args, &b)
|
41
|
+
recorder.record_call method_name, mode, expectation, *args, &b if recorder
|
42
|
+
end
|
35
43
|
|
36
44
|
end
|
37
45
|
|
@@ -43,10 +51,12 @@ module Caricature
|
|
43
51
|
# implementation of the template method for looking up the expectation and/or returning a value
|
44
52
|
def internal_deliver(mode, method_name, return_type, *args, &b)
|
45
53
|
exp = expectations.find(method_name, mode, *args)
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
res = instance.__send__(method_name, *args, &
|
54
|
+
bl = record_call(method_name, mode, exp, *args, &b)
|
55
|
+
if exp
|
56
|
+
block = exp.block || b
|
57
|
+
res = instance.__send__(method_name, *args, &block) if exp.super_before?
|
58
|
+
res = exp.execute *args, &bl
|
59
|
+
res = instance.__send__(method_name, *args, &block) if !exp.super_before? and exp.call_super?
|
50
60
|
res
|
51
61
|
else
|
52
62
|
nil
|
@@ -1,5 +1,24 @@
|
|
1
1
|
module Caricature
|
2
2
|
|
3
|
+
class BlockCallRecording
|
4
|
+
attr_accessor :call_number
|
5
|
+
attr_reader :args
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
@call_number = 1
|
9
|
+
@args = args
|
10
|
+
end
|
11
|
+
|
12
|
+
# compares one block variation to another.
|
13
|
+
# Also takes an array as an argument
|
14
|
+
def ==(other)
|
15
|
+
other = self.class.new(other) if other.respond_to?(:each)
|
16
|
+
return true if other.args.first.is_a?(Symbol) and other.args.first == :any
|
17
|
+
other.args == args
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
3
22
|
# A recording of an argument variation.
|
4
23
|
# Every time a method is called with different arguments
|
5
24
|
# the method call recorder will create an ArgumentVariation
|
@@ -16,21 +35,44 @@ module Caricature
|
|
16
35
|
# the number of the call that has the following parameters
|
17
36
|
attr_accessor :call_number
|
18
37
|
|
38
|
+
# the collection of block calls variations on this argument variation
|
39
|
+
attr_reader :blocks
|
40
|
+
|
19
41
|
# initializes a new instance of an argument recording.
|
20
42
|
# configures it with 1 call count and the args as an +Array+
|
21
43
|
def initialize(args=[], call_number=1, block=nil)
|
22
44
|
@args = args
|
23
45
|
@block = block
|
46
|
+
@blocks = []
|
24
47
|
@call_number = call_number
|
25
48
|
end
|
26
49
|
|
50
|
+
def add_block_variation(*args)
|
51
|
+
bv = find_block_variation(*args)
|
52
|
+
if bv.empty?
|
53
|
+
blocks << BlockCallRecording.new(*args)
|
54
|
+
else
|
55
|
+
bv.first.call_number += 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def find_block_variation(*args)
|
60
|
+
return @blocks if args.last.is_a?(Symbol) and args.last == :any
|
61
|
+
@blocks.select { |bv| bv.args == args }
|
62
|
+
end
|
63
|
+
|
27
64
|
# compares one argument variation to another.
|
28
65
|
# Also takes an array as an argument
|
29
66
|
def ==(other)
|
30
67
|
other = self.class.new(other) if other.respond_to?(:each)
|
31
68
|
return true if other.args.first.is_a?(Symbol) and other.args.first == :any
|
32
69
|
other.args == args
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_s
|
73
|
+
"<ArgumentRecording @args=#{args}, @block= #{block}, @call_number=#{call_number}"
|
33
74
|
end
|
75
|
+
alias_method :inspect, :to_s
|
34
76
|
end
|
35
77
|
|
36
78
|
# A recording that represents a method call
|
@@ -71,14 +113,23 @@ module Caricature
|
|
71
113
|
|
72
114
|
# add an argument variation
|
73
115
|
def add_argument_variation(args, block)
|
74
|
-
variation = find_argument_variations args
|
75
|
-
|
116
|
+
variation = find_argument_variations args, nil
|
117
|
+
if variation.empty?
|
118
|
+
@variations << ArgumentRecording.new(args, @variations.size+1, block) if variation == []
|
119
|
+
else
|
120
|
+
variation.first.call_number += 1
|
121
|
+
end
|
76
122
|
end
|
77
123
|
|
78
124
|
# finds an argument variation that matches the provided +args+
|
79
|
-
def find_argument_variations(args)
|
80
|
-
return @variations if args.first.is_a?(Symbol) and args.
|
81
|
-
@variations.select { |ar| ar.args == args }
|
125
|
+
def find_argument_variations(args, block_args)
|
126
|
+
return @variations if args.first.is_a?(Symbol) and args.last == :any
|
127
|
+
return @variations.select { |ar| ar.args == args } if block_args.nil?
|
128
|
+
return @variations.select { |ar| ar.args == args and ar.block } if block_args.last == :any
|
129
|
+
return @variations.select do |ar|
|
130
|
+
av = ar.args == args
|
131
|
+
av and not ar.find_block_variation(*block_args).empty?
|
132
|
+
end
|
82
133
|
end
|
83
134
|
end
|
84
135
|
|
@@ -97,19 +148,34 @@ module Caricature
|
|
97
148
|
end
|
98
149
|
|
99
150
|
# records a method call or increments the count of how many times this method was called.
|
100
|
-
def record_call(method_name, mode=:instance, *args, &block)
|
151
|
+
def record_call(method_name, mode=:instance, expectation=nil, *args, &block)
|
101
152
|
mn_sym = method_name.to_s.to_sym
|
102
153
|
method_calls[mode][mn_sym] ||= MethodCallRecording.new method_name
|
103
154
|
mc = method_calls[mode][mn_sym]
|
104
155
|
mc.count += 1
|
105
|
-
mc.add_argument_variation args, block
|
106
|
-
|
156
|
+
agc = mc.add_argument_variation args, block
|
157
|
+
b = (expectation && expectation.block) ? (expectation.block||block) : block
|
158
|
+
expectation.block = lambda do |*ags|
|
159
|
+
res = nil
|
160
|
+
res = b.call *ags if b
|
161
|
+
agc.first.add_block_variation *ags
|
162
|
+
res
|
163
|
+
end if expectation
|
164
|
+
block.nil? ? nil : (lambda { |*ags|
|
165
|
+
res = nil
|
166
|
+
res = block.call *ags if block
|
167
|
+
agc.first.add_block_variation *ags
|
168
|
+
res
|
169
|
+
})
|
170
|
+
end
|
107
171
|
|
108
172
|
# returns whether the method was actually called with the specified constraints
|
109
|
-
def was_called?(method_name, mode=:instance, *args)
|
110
|
-
mc = method_calls[mode][method_name.to_s.to_sym]
|
111
|
-
if mc
|
112
|
-
|
173
|
+
def was_called?(method_name, block_args, mode=:instance, *args)
|
174
|
+
mc = method_calls[mode][method_name.to_s.to_sym]
|
175
|
+
if mc
|
176
|
+
result = mc.find_argument_variations(args, block_args).first == args
|
177
|
+
raise ArgumentError, "Arguments don't match.\nYou expected: #{args.join(", ")}.\nI did find the following variations: #{mc.args.collect {|ar| ar.args.join(', ') }.join(' and ')}" unless result
|
178
|
+
result
|
113
179
|
else
|
114
180
|
return !!mc
|
115
181
|
end
|
File without changes
|
File without changes
|
@@ -6,7 +6,12 @@ module Caricature
|
|
6
6
|
|
7
7
|
# Initializes a new instance of a +Verification+
|
8
8
|
def initialize(method_name, recorder, mode=:instance)
|
9
|
-
@method_name, @args, @any_args, @recorder, @mode = method_name, [], true, recorder, mode
|
9
|
+
@method_name, @args, @any_args, @recorder, @mode, @block_args = method_name, [], true, recorder, mode, nil
|
10
|
+
init_plugin
|
11
|
+
end
|
12
|
+
|
13
|
+
def init_plugin
|
14
|
+
|
10
15
|
end
|
11
16
|
|
12
17
|
# indicates whether this verification can be for any arguments
|
@@ -22,6 +27,10 @@ module Caricature
|
|
22
27
|
self
|
23
28
|
end
|
24
29
|
|
30
|
+
def with_block_args(*args)
|
31
|
+
@block_args = args
|
32
|
+
end
|
33
|
+
|
25
34
|
# allow any arguments ignore the argument constraint
|
26
35
|
def allow_any_arguments
|
27
36
|
@any_args = true
|
@@ -36,7 +45,7 @@ module Caricature
|
|
36
45
|
# indicate that this method verification is successful
|
37
46
|
def successful?
|
38
47
|
a = any_args? ? [:any] : @args
|
39
|
-
@recorder.was_called?(@method_name, @mode, *a)
|
48
|
+
@recorder.was_called?(@method_name, @block_args, @mode, *a)
|
40
49
|
end
|
41
50
|
|
42
51
|
end
|
data/lib/caricature/version.rb
CHANGED
@@ -139,7 +139,7 @@ describe "Callbacks on expectations" do
|
|
139
139
|
cnt.should == 1
|
140
140
|
end
|
141
141
|
|
142
|
-
it "should execute a callback when an expectation is being invoked and with is
|
142
|
+
it "should execute a callback when an expectation is being invoked and with is defined in a block" do
|
143
143
|
cnt = 0
|
144
144
|
iso = Caricature::Isolation.for(Dagger)
|
145
145
|
iso.when_receiving(:damage) do |exp|
|
@@ -27,6 +27,7 @@ describe "CLR to CLR interactions" do
|
|
27
27
|
@weapon.when_receiving(:attack).with(ClrModels::Ninja.new).return(5)
|
28
28
|
|
29
29
|
@ninja.attack(ClrModels::Ninja.new, @weapon).should.equal 0
|
30
|
+
#@ninja.attack(ClrModels::Ninja.new, ClrModels::Sword.new).should.equal 0
|
30
31
|
end
|
31
32
|
|
32
33
|
it "should work for expectations with an argument constraint and an assertion argument constraint" do
|
@@ -102,8 +102,12 @@ describe "Caricature::ExpectationBuilder" do
|
|
102
102
|
@expectation.error_args.should.equal nil
|
103
103
|
end
|
104
104
|
|
105
|
+
it "should have a return callback" do
|
106
|
+
@expectation.return_callback.should.not.be.nil
|
107
|
+
end
|
108
|
+
|
105
109
|
it "should have the correct return_value" do
|
106
|
-
@expectation.
|
110
|
+
@expectation.return_callback.call.should.equal 5
|
107
111
|
end
|
108
112
|
|
109
113
|
end
|
@@ -226,4 +230,72 @@ describe "Caricature::ExpectationBuilder" do
|
|
226
230
|
end
|
227
231
|
end
|
228
232
|
|
233
|
+
describe "when giving a block to a super method it should register it" do
|
234
|
+
|
235
|
+
before do
|
236
|
+
builder = Caricature::ExpectationBuilder.new :some_method
|
237
|
+
@counter = 0
|
238
|
+
builder.super_after do
|
239
|
+
@counter += 1
|
240
|
+
end
|
241
|
+
@expectation = builder.build
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should should have a callback" do
|
245
|
+
@expectation.block.should.not.be.nil
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should pass on the correct callback" do
|
249
|
+
@expectation.block.call
|
250
|
+
@counter.should == 1
|
251
|
+
end
|
252
|
+
|
253
|
+
end
|
254
|
+
|
255
|
+
describe "when given arguments to the block pass method" do
|
256
|
+
|
257
|
+
before do
|
258
|
+
builder = Caricature::ExpectationBuilder.new :some_method
|
259
|
+
builder.pass_block(1,2,3)
|
260
|
+
@expectation = builder.build
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should not have a block callback" do
|
264
|
+
@expectation.should.not.has_block_callback
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should should execute the block with the provided arguments when executed" do
|
268
|
+
ags = []
|
269
|
+
@expectation.execute do |*args|
|
270
|
+
ags = args
|
271
|
+
end
|
272
|
+
ags.should == [1,2,3]
|
273
|
+
end
|
274
|
+
|
275
|
+
end
|
276
|
+
|
277
|
+
describe "when given arguments to the block pass method" do
|
278
|
+
|
279
|
+
before do
|
280
|
+
builder = Caricature::ExpectationBuilder.new :some_method
|
281
|
+
builder.pass_block do
|
282
|
+
[1,3,4]
|
283
|
+
end
|
284
|
+
@expectation = builder.build
|
285
|
+
end
|
286
|
+
|
287
|
+
it "should have a block callback" do
|
288
|
+
@expectation.should.has_block_callback
|
289
|
+
end
|
290
|
+
|
291
|
+
it "should execute the block with the result of the provided callback when executed" do
|
292
|
+
ags = []
|
293
|
+
@expectation.execute do |*args|
|
294
|
+
ags = args
|
295
|
+
end
|
296
|
+
ags.should == [1,3,4]
|
297
|
+
end
|
298
|
+
|
299
|
+
end
|
300
|
+
|
229
301
|
end
|
data/spec/unit/messaging_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/../bacon_helper"
|
2
2
|
|
3
3
|
class EmptyExpectations
|
4
|
+
|
4
5
|
def find(method_name, *args, &b)
|
5
6
|
nil
|
6
7
|
end
|
@@ -14,6 +15,10 @@ class ReturnValueExpecation
|
|
14
15
|
@called_super_after = false
|
15
16
|
end
|
16
17
|
|
18
|
+
def block
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
|
17
22
|
def super_before?
|
18
23
|
@super_before_called = true
|
19
24
|
false
|
@@ -39,6 +44,7 @@ class ReturnValueExpecation
|
|
39
44
|
end
|
40
45
|
|
41
46
|
class ReturnValueExpectations
|
47
|
+
|
42
48
|
def expectation
|
43
49
|
@expectation ||= ReturnValueExpecation.new
|
44
50
|
@expectation
|
@@ -49,6 +55,76 @@ class ReturnValueExpectations
|
|
49
55
|
end
|
50
56
|
end
|
51
57
|
|
58
|
+
class PassThruBlockExpectation
|
59
|
+
|
60
|
+
def block
|
61
|
+
@block
|
62
|
+
end
|
63
|
+
|
64
|
+
def block=(val)
|
65
|
+
@block=val
|
66
|
+
end
|
67
|
+
|
68
|
+
def block_args
|
69
|
+
[5,6,7]
|
70
|
+
end
|
71
|
+
|
72
|
+
def execute(*args, &b)
|
73
|
+
b.call *block_args
|
74
|
+
end
|
75
|
+
|
76
|
+
def super_before?
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
def call_super?
|
81
|
+
false
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
class CallingBlock
|
87
|
+
def a_message(*args, &b)
|
88
|
+
b.call(7,8,9)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class BlockExpectation
|
93
|
+
def block
|
94
|
+
lambda { |*args| return args }
|
95
|
+
end
|
96
|
+
|
97
|
+
def super_before?
|
98
|
+
false
|
99
|
+
end
|
100
|
+
|
101
|
+
def call_super?
|
102
|
+
true
|
103
|
+
end
|
104
|
+
|
105
|
+
def execute(*args, &b)
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class BlockExpectations
|
112
|
+
|
113
|
+
def initialize(pass_thru=true)
|
114
|
+
@pass_thru = pass_thru
|
115
|
+
end
|
116
|
+
|
117
|
+
def expectation
|
118
|
+
@expectation ||= (@pass_thru ? PassThruBlockExpectation.new : BlockExpectation.new)
|
119
|
+
@expectation
|
120
|
+
end
|
121
|
+
def find(method_name, *args, &b)
|
122
|
+
return expectation if method_name == :a_message
|
123
|
+
nil
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
52
128
|
describe "Caricature::Messenger strategies" do
|
53
129
|
|
54
130
|
describe "Caricature::RubyMessenger" do
|
@@ -84,7 +160,29 @@ describe "Caricature::Messenger strategies" do
|
|
84
160
|
|
85
161
|
end
|
86
162
|
|
163
|
+
describe "when an expectation with a block has been defined" do
|
164
|
+
|
165
|
+
it "should invoke the block that is passed with the args from the expectation only once" do
|
166
|
+
messenger = Caricature::RubyMessenger.new BlockExpectations.new
|
167
|
+
messenger.recorder = Caricature::MethodCallRecorder.new
|
168
|
+
counter = 0
|
169
|
+
arguments = []
|
170
|
+
messenger.deliver(:a_message, nil) do |*args|
|
171
|
+
counter += 1
|
172
|
+
arguments = args
|
173
|
+
end
|
174
|
+
counter.should == 1
|
175
|
+
[5,6,7].should == arguments
|
176
|
+
end
|
87
177
|
|
178
|
+
it "should call the block that is defined on the expectation by super when call super is enabled" do
|
179
|
+
exp = BlockExpectations.new(false)
|
180
|
+
messenger = Caricature::RubyMessenger.new exp, CallingBlock.new
|
181
|
+
result = messenger.deliver(:a_message, nil, exp.expectation)
|
182
|
+
[7,8,9].should == result
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
88
186
|
|
89
187
|
|
90
188
|
end
|
@@ -127,6 +225,29 @@ describe "Caricature::Messenger strategies" do
|
|
127
225
|
|
128
226
|
end
|
129
227
|
|
228
|
+
describe "when an expectation with a block has been defined" do
|
229
|
+
|
230
|
+
it "should invoke the block that is passed with the args from the expectation only once" do
|
231
|
+
messenger = Caricature::ClrClassMessenger.new BlockExpectations.new
|
232
|
+
messenger.recorder = Caricature::MethodCallRecorder.new
|
233
|
+
counter = 0
|
234
|
+
arguments = []
|
235
|
+
messenger.deliver(:a_message, nil) do |*args|
|
236
|
+
counter += 1
|
237
|
+
arguments = args
|
238
|
+
end
|
239
|
+
counter.should == 1
|
240
|
+
[5,6,7].should == arguments
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should call the block that is defined on the expectation by super when call super is enabled" do
|
244
|
+
messenger = Caricature::ClrClassMessenger.new BlockExpectations.new(false), CallingBlock.new
|
245
|
+
result = messenger.deliver(:a_message, nil)
|
246
|
+
[7,8,9].should == result
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
130
251
|
end
|
131
252
|
|
132
253
|
describe "Caricature::ClrInterfaceMessenger" do
|
@@ -167,6 +288,24 @@ describe "Caricature::Messenger strategies" do
|
|
167
288
|
|
168
289
|
end
|
169
290
|
|
291
|
+
describe "when an expectation with a block has been defined" do
|
292
|
+
|
293
|
+
it "should invoke the block that is passed with the args from the expectation only once" do
|
294
|
+
exp = BlockExpectations.new
|
295
|
+
messenger = Caricature::ClrInterfaceMessenger.new exp
|
296
|
+
messenger.recorder = Caricature::MethodCallRecorder.new
|
297
|
+
counter = 0
|
298
|
+
arguments = []
|
299
|
+
messenger.deliver(:a_message, nil, exp.expectation) do |*args|
|
300
|
+
counter += 1
|
301
|
+
arguments = args
|
302
|
+
end
|
303
|
+
counter.should == 1
|
304
|
+
[5,6,7].should == arguments
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
308
|
+
|
170
309
|
end
|
171
310
|
|
172
311
|
end
|
@@ -35,7 +35,7 @@ describe "MethodCallRecorder" do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should have no block" do
|
38
|
-
|
38
|
+
@mc.block.should.equal nil
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should have a count a 1" do
|
@@ -44,7 +44,7 @@ describe "MethodCallRecorder" do
|
|
44
44
|
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
end
|
48
48
|
|
49
49
|
describe "when recording a call without arguments but with a block" do
|
50
50
|
|
@@ -78,7 +78,7 @@ describe "MethodCallRecorder" do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
it "should have a block" do
|
81
|
-
|
81
|
+
@mc.args.first.block.should.not.equal nil
|
82
82
|
end
|
83
83
|
|
84
84
|
it "should have the correct block" do
|
@@ -96,7 +96,7 @@ describe "MethodCallRecorder" do
|
|
96
96
|
describe "when recording a call 1 argument" do
|
97
97
|
|
98
98
|
before do
|
99
|
-
@recorder.record_call :my_method, :instance, 1
|
99
|
+
@recorder.record_call :my_method, :instance, nil, 1
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should have 1 method call" do
|
@@ -126,7 +126,7 @@ describe "MethodCallRecorder" do
|
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should have no block" do
|
129
|
-
|
129
|
+
@mc.block.should.equal nil
|
130
130
|
end
|
131
131
|
|
132
132
|
it "should have a count a 1" do
|
@@ -140,7 +140,7 @@ describe "MethodCallRecorder" do
|
|
140
140
|
describe "when recording a call 2 arguments" do
|
141
141
|
|
142
142
|
before do
|
143
|
-
@recorder.record_call :my_method, :instance, 1, 2
|
143
|
+
@recorder.record_call :my_method, :instance, nil, 1, 2
|
144
144
|
end
|
145
145
|
|
146
146
|
it "should have 1 method call" do
|
@@ -170,7 +170,7 @@ describe "MethodCallRecorder" do
|
|
170
170
|
end
|
171
171
|
|
172
172
|
it "should have no block" do
|
173
|
-
|
173
|
+
@mc.block.should.equal nil
|
174
174
|
end
|
175
175
|
|
176
176
|
it "should have a count a 1" do
|
@@ -211,10 +211,10 @@ describe "MethodCallRecorder" do
|
|
211
211
|
end
|
212
212
|
|
213
213
|
it "should have no block" do
|
214
|
-
|
214
|
+
@mc.block.should.equal nil
|
215
215
|
end
|
216
216
|
|
217
|
-
it "should have a count
|
217
|
+
it "should have a count of 2" do
|
218
218
|
@mc.count.should.equal 2
|
219
219
|
end
|
220
220
|
|
@@ -222,11 +222,35 @@ describe "MethodCallRecorder" do
|
|
222
222
|
|
223
223
|
end
|
224
224
|
|
225
|
+
describe "when recording a call with a block" do
|
226
|
+
before do
|
227
|
+
@args = []
|
228
|
+
@b = @recorder.record_call :some_method, :instance, nil, 5, 6, 7 do |*args|
|
229
|
+
@args = args
|
230
|
+
end
|
231
|
+
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should return a block" do
|
235
|
+
@b.should.not.be.nil
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should return a block that wraps a recording" do
|
239
|
+
@b.call 8, 9, 0
|
240
|
+
@recorder.method_calls[:instance][:some_method].args.first.blocks.first.args.should.equal [8, 9, 0]
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should call the original block" do
|
244
|
+
@b.call 8, 9, 0
|
245
|
+
@args.should.equal [8, 9, 0]
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
225
249
|
describe "when recording 2 calls with different arguments" do
|
226
250
|
|
227
251
|
before do
|
228
252
|
@recorder.record_call :my_method
|
229
|
-
@recorder.record_call :my_method, :instance, 1, 3, 4
|
253
|
+
@recorder.record_call :my_method, :instance, nil, 1, 3, 4
|
230
254
|
end
|
231
255
|
|
232
256
|
it "should have 1 method call" do
|
@@ -252,10 +276,10 @@ describe "MethodCallRecorder" do
|
|
252
276
|
end
|
253
277
|
|
254
278
|
it "should have no block" do
|
255
|
-
|
279
|
+
@mc.block.should.equal nil
|
256
280
|
end
|
257
281
|
|
258
|
-
it "should have a count
|
282
|
+
it "should have a count of 2" do
|
259
283
|
@mc.count.should.equal 2
|
260
284
|
end
|
261
285
|
|
@@ -267,29 +291,53 @@ describe "MethodCallRecorder" do
|
|
267
291
|
|
268
292
|
before do
|
269
293
|
@recorder.record_call :my_method
|
270
|
-
@recorder.record_call :my_method, :instance, 1, 3, 4
|
294
|
+
@recorder.record_call :my_method, :instance, nil, 1, 3, 4
|
295
|
+
|
271
296
|
end
|
272
297
|
|
273
298
|
it "should confirm when we don't care about the arguments" do
|
274
|
-
@recorder.was_called?(:my_method, :instance, :any).should.be.true?
|
299
|
+
@recorder.was_called?(:my_method, nil, :instance, :any).should.be.true?
|
275
300
|
end
|
276
301
|
|
277
302
|
it "should confirm when there are no argument variations" do
|
278
303
|
@recorder.record_call :another_method
|
279
|
-
@recorder.was_called?(:another_method, :instance, :any).should.be.true?
|
304
|
+
@recorder.was_called?(:another_method, nil, :instance, :any).should.be.true?
|
280
305
|
end
|
281
306
|
|
282
307
|
it "should be negative when we provide the wrong arguments" do
|
283
|
-
@recorder.was_called?(:my_method, :instance, 1, 2, 5).should.
|
308
|
+
lambda { @recorder.was_called?(:my_method, nil, :instance, 1, 2, 5) }.should.raise(ArgumentError)
|
284
309
|
end
|
285
310
|
|
286
311
|
it "should be positive when we provide the correct arguments" do
|
287
|
-
@recorder.was_called?(:my_method, :instance, 1, 3, 4).should.be.true?
|
312
|
+
@recorder.was_called?(:my_method, nil, :instance, 1, 3, 4).should.be.true?
|
288
313
|
end
|
289
314
|
|
290
315
|
it "should be positive when we provide no arguments and a call had been recorded without arguments" do
|
291
|
-
@recorder.was_called?(:my_method, :instance).should.be.true?
|
316
|
+
@recorder.was_called?(:my_method, nil, :instance).should.be.true?
|
317
|
+
end
|
318
|
+
|
319
|
+
describe "with block" do
|
320
|
+
|
321
|
+
before do
|
322
|
+
@args = []
|
323
|
+
b = @recorder.record_call :some_method, :instance, nil, 5, 6, 7 do |*args|
|
324
|
+
@args << args
|
325
|
+
end
|
326
|
+
b.call 1, 3, 5
|
327
|
+
b.call 3, 4, 6
|
328
|
+
b.call
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should be positive when we provide any arguments" do
|
332
|
+
@recorder.was_called?(:some_method, [:any], :instance, :any).should.be.true?
|
333
|
+
end
|
334
|
+
|
335
|
+
it "should be positive when we provide specific arguments" do
|
336
|
+
@recorder.was_called?(:some_method, [1, 3, 5], :instance, :any).should.be.true?
|
337
|
+
end
|
338
|
+
|
292
339
|
end
|
340
|
+
|
293
341
|
end
|
294
342
|
|
295
343
|
end
|
@@ -72,7 +72,7 @@ describe "Caricature::Verification" do
|
|
72
72
|
before do
|
73
73
|
@rec = Caricature::MethodCallRecorder.new
|
74
74
|
@rec.record_call :my_method
|
75
|
-
@rec.record_call :my_method, :instance, 1, 2, 3
|
75
|
+
@rec.record_call :my_method, :instance, nil, 1, 2, 3
|
76
76
|
@rec.record_call :another_method
|
77
77
|
|
78
78
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caricature
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Porto Carrero
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-23 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -35,6 +35,8 @@ files:
|
|
35
35
|
- Rakefile
|
36
36
|
- caricature.gemspec
|
37
37
|
- lib/caricature.rb
|
38
|
+
- lib/caricature/bacon.rb
|
39
|
+
- lib/caricature/bacon/integration.rb
|
38
40
|
- lib/caricature/clr.rb
|
39
41
|
- lib/caricature/clr/aspnet_mvc.rb
|
40
42
|
- lib/caricature/clr/descriptor.rb
|
@@ -47,6 +49,8 @@ files:
|
|
47
49
|
- lib/caricature/isolator.rb
|
48
50
|
- lib/caricature/messenger.rb
|
49
51
|
- lib/caricature/method_call_recorder.rb
|
52
|
+
- lib/caricature/rspec.rb
|
53
|
+
- lib/caricature/rspec/integration.rb
|
50
54
|
- lib/caricature/verification.rb
|
51
55
|
- lib/caricature/version.rb
|
52
56
|
- lib/core_ext/array.rb
|
@@ -60,7 +64,6 @@ files:
|
|
60
64
|
- lib/core_ext/system/type.rb
|
61
65
|
- spec/bacon_helper.rb
|
62
66
|
- spec/bin/ClrModels.dll
|
63
|
-
- spec/bin/ClrModels.dll.mdb
|
64
67
|
- spec/integration/callback_spec.rb
|
65
68
|
- spec/integration/clr_to_clr_spec.rb
|
66
69
|
- spec/integration/clr_to_ruby_spec.rb
|
@@ -87,9 +90,8 @@ rdoc_options:
|
|
87
90
|
- --title
|
88
91
|
- Caricature brings simple mocking to Ruby, DLR and CLR.
|
89
92
|
- --main
|
90
|
-
-
|
93
|
+
- README.rdoc
|
91
94
|
- --line-numbers
|
92
|
-
- --inline-source
|
93
95
|
- --format
|
94
96
|
- darkfish
|
95
97
|
require_paths:
|
data/spec/bin/ClrModels.dll.mdb
DELETED
Binary file
|