rr 0.2.1 → 0.2.2
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 +4 -0
- data/Rakefile +1 -1
- data/examples/rr/double/double_bind_example.rb +11 -0
- data/lib/rr/double.rb +22 -9
- metadata +1 -1
data/CHANGES
CHANGED
data/Rakefile
CHANGED
@@ -28,6 +28,12 @@ describe Double, "#bind with an existing method" do
|
|
28
28
|
@object.foobar
|
29
29
|
rr_foobar_called.should == true
|
30
30
|
end
|
31
|
+
|
32
|
+
it "stores original method in __rr__original_method_name" do
|
33
|
+
@double.bind
|
34
|
+
@object.respond_to?(:__rr__original_foobar).should == true
|
35
|
+
@object.method(:__rr__original_foobar).should == @original_method
|
36
|
+
end
|
31
37
|
end
|
32
38
|
|
33
39
|
describe Double, "#bind without an existing method" do
|
@@ -55,5 +61,10 @@ describe Double, "#bind without an existing method" do
|
|
55
61
|
@object.foobar
|
56
62
|
rr_foobar_called.should == true
|
57
63
|
end
|
64
|
+
|
65
|
+
it "stores original method in __rr__original_method_name" do
|
66
|
+
@double.bind
|
67
|
+
@object.respond_to?(:__rr__original_foobar).should == false
|
68
|
+
end
|
58
69
|
end
|
59
70
|
end
|
data/lib/rr/double.rb
CHANGED
@@ -4,13 +4,15 @@ module RR
|
|
4
4
|
# has Argument Expectations and Times called Expectations.
|
5
5
|
class Double
|
6
6
|
MethodArguments = Struct.new(:arguments, :block)
|
7
|
-
attr_reader :space, :object, :method_name, :
|
7
|
+
attr_reader :space, :object, :method_name, :scenarios
|
8
8
|
|
9
9
|
def initialize(space, object, method_name)
|
10
10
|
@space = space
|
11
11
|
@object = object
|
12
12
|
@method_name = method_name.to_sym
|
13
|
-
|
13
|
+
if @object.respond_to?(method_name)
|
14
|
+
meta.send(:alias_method, original_method_name, method_name)
|
15
|
+
end
|
14
16
|
@scenarios = []
|
15
17
|
end
|
16
18
|
|
@@ -22,7 +24,7 @@ module RR
|
|
22
24
|
|
23
25
|
# RR::Double#bind injects a method that acts as a dispatcher
|
24
26
|
# that dispatches to the matching Scenario when the method
|
25
|
-
# is called.
|
27
|
+
# is called.
|
26
28
|
def bind
|
27
29
|
define_implementation_placeholder
|
28
30
|
returns_method = <<-METHOD
|
@@ -44,16 +46,24 @@ module RR
|
|
44
46
|
|
45
47
|
# RR::Double#reset removes the injected dispatcher method.
|
46
48
|
# It binds the original method implementation on the object
|
47
|
-
# if one exists.
|
49
|
+
# if one exists.
|
48
50
|
def reset
|
49
51
|
meta.send(:remove_method, placeholder_name)
|
50
|
-
if
|
51
|
-
meta.send(:
|
52
|
+
if original_method
|
53
|
+
meta.send(:alias_method, @method_name, original_method_name)
|
54
|
+
meta.send(:remove_method, original_method_name)
|
52
55
|
else
|
53
56
|
meta.send(:remove_method, @method_name)
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
60
|
+
# The original method of the object. It returns nil if the object
|
61
|
+
# does not have an original method.
|
62
|
+
def original_method
|
63
|
+
return nil unless @object.respond_to?(original_method_name)
|
64
|
+
return @object.method(original_method_name)
|
65
|
+
end
|
66
|
+
|
57
67
|
protected
|
58
68
|
def define_implementation_placeholder
|
59
69
|
me = self
|
@@ -69,7 +79,6 @@ module RR
|
|
69
79
|
scenario_not_found_error(*args)
|
70
80
|
end
|
71
81
|
|
72
|
-
protected
|
73
82
|
def find_scenario_to_attempt(args)
|
74
83
|
matches = ScenarioMatches.new(@scenarios).find_all_matches!(args)
|
75
84
|
|
@@ -106,9 +115,13 @@ module RR
|
|
106
115
|
def placeholder_name
|
107
116
|
"__rr__#{@method_name}"
|
108
117
|
end
|
109
|
-
|
118
|
+
|
119
|
+
def original_method_name
|
120
|
+
"__rr__original_#{@method_name}"
|
121
|
+
end
|
122
|
+
|
110
123
|
def meta
|
111
124
|
(class << @object; self; end)
|
112
125
|
end
|
113
126
|
end
|
114
|
-
end
|
127
|
+
end
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.3
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
6
|
+
version: 0.2.2
|
7
7
|
date: 2007-07-17 00:00:00 -07:00
|
8
8
|
summary: RR (Double Ruby) is a double framework that features a rich selection of double techniques and a terse syntax. http://xunitpatterns.com/Test%20Double.html
|
9
9
|
require_paths:
|