rr 0.4.10 → 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.
Files changed (110) hide show
  1. data/CHANGES +14 -0
  2. data/README.rdoc +67 -13
  3. data/Rakefile +1 -1
  4. data/lib/rr.rb +29 -9
  5. data/lib/rr/adapters/rr_methods.rb +38 -158
  6. data/lib/rr/double.rb +46 -41
  7. data/lib/rr/double_definitions/child_double_definition_creator.rb +23 -0
  8. data/lib/rr/double_definitions/double_definition.rb +212 -0
  9. data/lib/rr/double_definitions/double_definition_creator.rb +153 -0
  10. data/lib/rr/double_definitions/double_definition_creator_proxy.rb +25 -0
  11. data/lib/rr/double_definitions/strategies/implementation/implementation_strategy.rb +15 -0
  12. data/lib/rr/double_definitions/strategies/implementation/proxy.rb +62 -0
  13. data/lib/rr/double_definitions/strategies/implementation/reimplementation.rb +14 -0
  14. data/lib/rr/double_definitions/strategies/scope/instance.rb +15 -0
  15. data/lib/rr/double_definitions/strategies/scope/instance_of_class.rb +43 -0
  16. data/lib/rr/double_definitions/strategies/scope/scope_strategy.rb +15 -0
  17. data/lib/rr/double_definitions/strategies/strategy.rb +70 -0
  18. data/lib/rr/double_definitions/strategies/verification/dont_allow.rb +34 -0
  19. data/lib/rr/double_definitions/strategies/verification/mock.rb +44 -0
  20. data/lib/rr/double_definitions/strategies/verification/stub.rb +45 -0
  21. data/lib/rr/double_definitions/strategies/verification/verification_strategy.rb +15 -0
  22. data/lib/rr/double_injection.rb +21 -15
  23. data/lib/rr/expectations/argument_equality_expectation.rb +2 -1
  24. data/lib/rr/space.rb +23 -22
  25. data/lib/rr/wildcard_matchers/hash_including.rb +29 -0
  26. data/lib/rr/wildcard_matchers/satisfy.rb +26 -0
  27. data/spec/high_level_spec.rb +111 -64
  28. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +1 -1
  29. data/spec/rr/adapters/rr_methods_creator_spec.rb +99 -315
  30. data/spec/rr/adapters/rr_methods_space_spec.rb +90 -109
  31. data/spec/rr/adapters/rr_methods_spec_helper.rb +1 -1
  32. data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +1 -1
  33. data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +103 -0
  34. data/spec/rr/double_definitions/double_definition_creator_proxy_spec.rb +83 -0
  35. data/spec/rr/double_definitions/double_definition_creator_spec.rb +495 -0
  36. data/spec/rr/double_definitions/double_definition_spec.rb +1116 -0
  37. data/spec/rr/double_injection/double_injection_bind_spec.rb +111 -0
  38. data/spec/rr/double_injection/double_injection_dispatching_spec.rb +245 -0
  39. data/spec/rr/{double → double_injection}/double_injection_has_original_method_spec.rb +9 -9
  40. data/spec/rr/double_injection/double_injection_reset_spec.rb +90 -0
  41. data/spec/rr/double_injection/double_injection_spec.rb +77 -0
  42. data/spec/rr/double_injection/double_injection_verify_spec.rb +29 -0
  43. data/spec/rr/double_spec.rb +156 -136
  44. data/spec/rr/errors/rr_error_spec.rb +1 -1
  45. data/spec/rr/expectations/any_argument_expectation_spec.rb +1 -1
  46. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +6 -30
  47. data/spec/rr/expectations/argument_equality_expectation_spec.rb +35 -18
  48. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +22 -41
  49. data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +82 -0
  50. data/spec/rr/expectations/hash_including_spec.rb +17 -0
  51. data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +59 -0
  52. data/spec/rr/expectations/satisfy_spec.rb +14 -0
  53. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +30 -28
  54. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +55 -54
  55. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +49 -48
  56. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +9 -7
  57. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +77 -76
  58. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +58 -57
  59. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +59 -58
  60. data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +25 -24
  61. data/spec/rr/rspec/rspec_adapter_spec.rb +12 -11
  62. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +10 -8
  63. data/spec/rr/rspec/rspec_usage_spec.rb +1 -1
  64. data/spec/rr/space/hash_with_object_id_key_spec.rb +1 -1
  65. data/spec/rr/space/space_spec.rb +330 -192
  66. data/spec/rr/test_unit/test_helper.rb +1 -2
  67. data/spec/rr/test_unit/test_unit_backtrace_test.rb +1 -2
  68. data/spec/rr/test_unit/test_unit_integration_test.rb +1 -2
  69. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +1 -1
  70. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +1 -1
  71. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +1 -1
  72. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +1 -1
  73. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +1 -1
  74. data/spec/rr/times_called_matchers/range_matcher_spec.rb +1 -1
  75. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +1 -1
  76. data/spec/rr/wildcard_matchers/anything_spec.rb +24 -0
  77. data/spec/rr/wildcard_matchers/boolean_spec.rb +36 -0
  78. data/spec/rr/wildcard_matchers/duck_type_spec.rb +52 -0
  79. data/spec/rr/wildcard_matchers/is_a_spec.rb +32 -0
  80. data/spec/rr/wildcard_matchers/numeric_spec.rb +32 -0
  81. data/spec/rr/wildcard_matchers/range_spec.rb +35 -0
  82. data/spec/rr/wildcard_matchers/regexp_spec.rb +43 -0
  83. data/spec/rr_spec.rb +28 -0
  84. data/spec/spec_helper.rb +84 -0
  85. metadata +43 -29
  86. data/lib/rr/double_creator.rb +0 -271
  87. data/lib/rr/double_definition.rb +0 -179
  88. data/lib/rr/double_definition_builder.rb +0 -44
  89. data/lib/rr/double_definition_creator.rb +0 -156
  90. data/lib/rr/double_definition_creator_proxy.rb +0 -20
  91. data/spec/rr/double/double_injection_bind_spec.rb +0 -105
  92. data/spec/rr/double/double_injection_dispatching_spec.rb +0 -228
  93. data/spec/rr/double/double_injection_reset_spec.rb +0 -86
  94. data/spec/rr/double/double_injection_spec.rb +0 -72
  95. data/spec/rr/double/double_injection_verify_spec.rb +0 -24
  96. data/spec/rr/double_definition_creator_proxy_spec.rb +0 -85
  97. data/spec/rr/double_definition_creator_spec.rb +0 -496
  98. data/spec/rr/double_definition_spec.rb +0 -815
  99. data/spec/rr/expectations/anything_spec.rb +0 -14
  100. data/spec/rr/expectations/boolean_spec.rb +0 -14
  101. data/spec/rr/expectations/duck_type_argument_equality_expectation_spec.rb +0 -71
  102. data/spec/rr/expectations/duck_type_spec.rb +0 -14
  103. data/spec/rr/expectations/is_a_argument_equality_expectation_spec.rb +0 -51
  104. data/spec/rr/expectations/is_a_spec.rb +0 -14
  105. data/spec/rr/expectations/numeric_argument_equality_expectation_spec.rb +0 -47
  106. data/spec/rr/expectations/numeric_spec.rb +0 -14
  107. data/spec/rr/expectations/range_argument_equality_expectation_spec.rb +0 -59
  108. data/spec/rr/expectations/range_spec.rb +0 -10
  109. data/spec/rr/expectations/regexp_argument_equality_expectation_spec.rb +0 -72
  110. data/spec/rr/expectations/regexp_spec.rb +0 -10
@@ -1,86 +0,0 @@
1
- require "spec/spec_helper"
2
-
3
- module RR
4
- describe DoubleInjection, "#reset", :shared => true do
5
- it "cleans up by removing the __rr__method" do
6
- @double_injection.bind
7
- @object.methods.should include("__rr__foobar")
8
-
9
- @double_injection.reset
10
- @object.methods.should_not include("__rr__foobar")
11
- end
12
- end
13
-
14
- describe DoubleInjection, "#reset when method does not exist" do
15
- it_should_behave_like "RR::DoubleInjection#reset"
16
-
17
- before do
18
- @object = Object.new
19
- @method_name = :foobar
20
- @object.methods.should_not include(@method_name.to_s)
21
- @double_injection = DoubleInjection.new(@object, @method_name)
22
- end
23
-
24
- it "removes the method" do
25
- @double_injection.bind
26
- @object.methods.should include(@method_name.to_s)
27
-
28
- @double_injection.reset
29
- @object.methods.should_not include(@method_name.to_s)
30
- lambda {@object.foobar}.should raise_error(NoMethodError)
31
- end
32
- end
33
-
34
- describe DoubleInjection, "#reset when method exists" do
35
- it_should_behave_like "RR::DoubleInjection#reset"
36
-
37
- before do
38
- @object = Object.new
39
- @method_name = :foobar
40
- def @object.foobar
41
- :original_foobar
42
- end
43
- @object.methods.should include(@method_name.to_s)
44
- @original_method = @object.method(@method_name)
45
- @double_injection = DoubleInjection.new(@object, @method_name)
46
-
47
- @double_injection.bind
48
- @object.methods.should include(@method_name.to_s)
49
- end
50
-
51
- it "rebind original method" do
52
- @double_injection.reset
53
- @object.methods.should include(@method_name.to_s)
54
- @object.foobar.should == :original_foobar
55
- end
56
- end
57
-
58
- describe DoubleInjection, "#reset when method with block exists" do
59
- it_should_behave_like "RR::DoubleInjection#reset"
60
-
61
- before do
62
- @object = Object.new
63
- @method_name = :foobar
64
- def @object.foobar
65
- yield(:original_argument)
66
- end
67
- @object.methods.should include(@method_name.to_s)
68
- @original_method = @object.method(@method_name)
69
- @double_injection = DoubleInjection.new(@object, @method_name)
70
-
71
- @double_injection.bind
72
- @object.methods.should include(@method_name.to_s)
73
- end
74
-
75
- it "rebinds original method with block" do
76
- @double_injection.reset
77
- @object.methods.should include(@method_name.to_s)
78
-
79
- original_argument = nil
80
- @object.foobar do |arg|
81
- original_argument = arg
82
- end
83
- original_argument.should == :original_argument
84
- end
85
- end
86
- end
@@ -1,72 +0,0 @@
1
- require "spec/spec_helper"
2
-
3
- module RR
4
- describe DoubleInjection, :shared => true do
5
- it "sets up object and method_name" do
6
- @double_injection.object.should === @object
7
- @double_injection.method_name.should == @method_name.to_sym
8
- end
9
- end
10
-
11
- describe DoubleInjection, "#initialize where method_name is a symbol" do
12
- it_should_behave_like "RR::DoubleInjection"
13
-
14
- before do
15
- @object = Object.new
16
- @method_name = :foobar
17
- @object.methods.should_not include(@method_name.to_s)
18
- @double_injection = DoubleInjection.new(@object, @method_name)
19
- end
20
- end
21
-
22
- describe DoubleInjection, "#initialize where method_name is a string" do
23
- it_should_behave_like "RR::DoubleInjection"
24
-
25
- before do
26
- @object = Object.new
27
- @method_name = 'foobar'
28
- @object.methods.should_not include(@method_name)
29
- @double_injection = DoubleInjection.new(@object, @method_name)
30
- end
31
- end
32
-
33
- describe DoubleInjection, "#initialize where method does not exist on object" do
34
- it_should_behave_like "RR::DoubleInjection"
35
-
36
- before do
37
- @object = Object.new
38
- @method_name = :foobar
39
- @object.methods.should_not include(@method_name.to_s)
40
- @double_injection = DoubleInjection.new(@object, @method_name)
41
- end
42
-
43
- it "object does not have original method" do
44
- @double_injection.object_has_original_method?.should be_false
45
- end
46
- end
47
-
48
- describe DoubleInjection, "#initialize where method exists on object" do
49
- it_should_behave_like "RR::DoubleInjection"
50
-
51
- before do
52
- @object = Object.new
53
- @method_name = :to_s
54
- @object.methods.should include(@method_name.to_s)
55
- @double_injection = DoubleInjection.new(@object, @method_name)
56
- end
57
-
58
- it "has a original_method" do
59
- @double_injection.object_has_original_method?.should be_true
60
- end
61
- end
62
-
63
- describe DoubleInjection, "#initialize where method_name is ==" do
64
- it_should_behave_like "RR::DoubleInjection"
65
-
66
- before do
67
- @object = Object.new
68
- @method_name = '=='
69
- @double_injection = DoubleInjection.new(@object, @method_name)
70
- end
71
- end
72
- end
@@ -1,24 +0,0 @@
1
- require "spec/spec_helper"
2
-
3
- module RR
4
- describe DoubleInjection, "#verify" do
5
- it_should_behave_like "Swapped Space"
6
- before do
7
- @space = Space.instance
8
- @object = Object.new
9
- @method_name = :foobar
10
- @object.methods.should_not include(@method_name.to_s)
11
- @double_injection = @space.double_injection(@object, @method_name)
12
- end
13
-
14
- it "verifies each double was met" do
15
- double = Double.new(@double_injection, DoubleDefinition.new)
16
- @double_injection.register_double double
17
-
18
- double.with(1).once.returns {nil}
19
- lambda {@double_injection.verify}.should raise_error(Errors::TimesCalledError)
20
- @object.foobar(1)
21
- lambda {@double_injection.verify}.should_not raise_error
22
- end
23
- end
24
- end
@@ -1,85 +0,0 @@
1
- require "spec/spec_helper"
2
-
3
- module RR
4
- describe DoubleDefinitionCreatorProxy do
5
- attr_reader :space, :subject, :creator, :the_proxy
6
- it_should_behave_like "Swapped Space"
7
-
8
- before(:each) do
9
- @space = Space.instance
10
- @subject = Object.new
11
- @creator = DoubleDefinitionCreator.new
12
- creator.mock
13
- end
14
-
15
- class << self
16
- define_method("initializes proxy with passed in creator") do
17
- it "initializes proxy with passed in creator" do
18
- class << the_proxy
19
- attr_reader :creator
20
- end
21
- the_proxy.creator.should === creator
22
- end
23
- end
24
- end
25
-
26
- describe ".new" do
27
- it "does not undefine object_id" do
28
- the_proxy = DoubleDefinitionCreatorProxy.new(creator, subject)
29
- the_proxy.object_id.class.should == Fixnum
30
- end
31
-
32
- context "without block" do
33
- before do
34
- @the_proxy = DoubleDefinitionCreatorProxy.new(creator, subject)
35
- end
36
-
37
- send "initializes proxy with passed in creator"
38
-
39
- it "clears out all methods from proxy" do
40
- proxy_subclass = Class.new(DoubleDefinitionCreatorProxy) do
41
- def i_should_be_a_double
42
- end
43
- end
44
- proxy_subclass.instance_methods.map {|m| m.to_s}.should include('i_should_be_a_double')
45
-
46
- proxy = proxy_subclass.new(creator, subject)
47
- proxy.i_should_be_a_double.should be_instance_of(DoubleDefinition)
48
- end
49
- end
50
-
51
- context "with block" do
52
- before do
53
- @the_proxy = DoubleDefinitionCreatorProxy.new(creator, subject) do |b|
54
- b.foobar(1, 2) {:one_two}
55
- b.foobar(1) {:one}
56
- b.foobar.with_any_args {:default}
57
- b.baz() {:baz_result}
58
- end
59
- end
60
-
61
- send "initializes proxy with passed in creator"
62
-
63
- it "creates double_injections" do
64
- subject.foobar(1, 2).should == :one_two
65
- subject.foobar(1).should == :one
66
- subject.foobar(:something).should == :default
67
- subject.baz.should == :baz_result
68
- end
69
-
70
- it "clears out all methods from proxy" do
71
- proxy_subclass = Class.new(DoubleDefinitionCreatorProxy) do
72
- def i_should_be_a_double
73
- end
74
- end
75
- proxy_subclass.instance_methods.map {|m| m.to_s}.should include('i_should_be_a_double')
76
-
77
- proxy_subclass.new(creator, subject) do |m|
78
- m.i_should_be_a_double.should be_instance_of(DoubleDefinition)
79
- end
80
- end
81
- end
82
- end
83
-
84
- end
85
- end
@@ -1,496 +0,0 @@
1
- require "spec/spec_helper"
2
-
3
- module RR
4
- describe DoubleDefinitionCreator, " strategy definition", :shared => true do
5
- it "returns self when passing no args" do
6
- creator.__send__(method_name).should === creator
7
- end
8
-
9
- it "returns a DoubleDefinitionCreatorProxy when passed a subject" do
10
- double = creator.__send__(method_name, subject).foobar
11
- double.should be_instance_of(DoubleDefinition)
12
- end
13
-
14
- it "returns a DoubleDefinitionCreatorProxy when passed Kernel" do
15
- double = creator.__send__(method_name, Kernel).foobar
16
- double.should be_instance_of(DoubleDefinition)
17
- end
18
-
19
- it "raises error if passed a method name and a block" do
20
- lambda do
21
- creator.__send__(method_name, subject, :foobar) {}
22
- end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
23
- end
24
-
25
- it "raises error when using mock strategy" do
26
- creator.mock
27
- lambda do
28
- creator.__send__(method_name)
29
- end.should raise_error(
30
- Errors::DoubleDefinitionError,
31
- "This Double already has a mock strategy"
32
- )
33
- end
34
-
35
- it "raises error when using stub strategy" do
36
- creator.stub
37
- lambda do
38
- creator.__send__(method_name)
39
- end.should raise_error(
40
- Errors::DoubleDefinitionError,
41
- "This Double already has a stub strategy"
42
- )
43
- end
44
-
45
- it "raises error when using dont_allow strategy" do
46
- creator.dont_allow
47
- lambda do
48
- creator.__send__(method_name)
49
- end.should raise_error(
50
- Errors::DoubleDefinitionError,
51
- "This Double already has a dont_allow strategy"
52
- )
53
- end
54
- end
55
-
56
- describe DoubleDefinitionCreator do
57
- attr_reader :creator, :subject, :space, :method_name
58
- it_should_behave_like "Swapped Space"
59
- before(:each) do
60
- @space = Space.instance
61
- @subject = Object.new
62
- @creator = DoubleDefinitionCreator.new
63
- end
64
-
65
- describe "#mock" do
66
- it_should_behave_like "RR::DoubleDefinitionCreator strategy definition"
67
-
68
- before do
69
- @method_name = :mock
70
- end
71
-
72
- it "sets up the RR mock call chain" do
73
- creates_mock_call_chain(creator.mock(subject))
74
- end
75
-
76
- it "sets up the DoubleDefinition to be in returns block_callback_strategy" do
77
- double = creator.mock(subject, :foobar)
78
- double.block_callback_strategy.should == :returns
79
- end
80
-
81
- def creates_mock_call_chain(creator)
82
- double = creator.foobar(1, 2) {:baz}
83
- double.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
84
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
85
- double.argument_expectation.expected_arguments.should == [1, 2]
86
-
87
- subject.foobar(1, 2).should == :baz
88
- end
89
-
90
- context "when passed a second argument" do
91
- it "creates a mock Double for method" do
92
- creates_double_with_method_name( creator.mock(subject, :foobar) )
93
- end
94
-
95
- def creates_double_with_method_name(double)
96
- double.with(1, 2) {:baz}
97
- double.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
98
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
99
- double.argument_expectation.expected_arguments.should == [1, 2]
100
-
101
- subject.foobar(1, 2).should == :baz
102
- end
103
- end
104
-
105
- context "when passed method_name and block" do
106
- it "raises error" do
107
- lambda do
108
- @creator.mock(@object, :foobar) {}
109
- end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
110
- end
111
- end
112
- end
113
-
114
- describe "#stub" do
115
- it_should_behave_like "RR::DoubleDefinitionCreator strategy definition"
116
-
117
- before do
118
- @method_name = :stub
119
- end
120
-
121
- it "sets up the RR stub call chain" do
122
- creates_stub_call_chain(creator.stub(subject))
123
- end
124
-
125
- it "sets up the DoubleDefinition to be in returns block_callback_strategy" do
126
- double = creator.stub(subject, :foobar)
127
- double.block_callback_strategy.should == :returns
128
- end
129
-
130
- context "when passed a second argument" do
131
- it "creates a stub Double for method when passed a second argument" do
132
- creates_double_with_method_name(creator.stub(subject, :foobar))
133
- end
134
-
135
- def creates_double_with_method_name(double)
136
- double.with(1, 2) {:baz}
137
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
138
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
139
- subject.foobar(1, 2).should == :baz
140
- end
141
- end
142
-
143
- def creates_stub_call_chain(creator)
144
- double = creator.foobar(1, 2) {:baz}
145
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
146
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
147
- subject.foobar(1, 2).should == :baz
148
- end
149
-
150
- context "when passed method_name and block" do
151
- it "raises error" do
152
- lambda do
153
- @creator.stub(@object, :foobar) {}
154
- end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
155
- end
156
- end
157
- end
158
-
159
- describe "#dont_allow" do
160
- it_should_behave_like "RR::DoubleDefinitionCreator strategy definition"
161
-
162
- before do
163
- @method_name = :dont_allow
164
- end
165
-
166
- it "raises error when proxied" do
167
- creator.proxy
168
- lambda do
169
- creator.dont_allow
170
- end.should raise_error(
171
- Errors::DoubleDefinitionError,
172
- "Doubles cannot be proxied when using dont_allow strategy"
173
- )
174
- end
175
-
176
- it "sets up the RR dont_allow call chain" do
177
- creates_dont_allow_call_chain(creator.dont_allow(subject))
178
- end
179
-
180
- it "sets up the RR dont_allow call chain" do
181
- creates_dont_allow_call_chain(creator.dont_call(subject))
182
- end
183
-
184
- it "sets up the RR dont_allow call chain" do
185
- creates_dont_allow_call_chain(creator.do_not_allow(subject))
186
- end
187
-
188
- it "sets up the RR dont_allow call chain" do
189
- creates_dont_allow_call_chain(creator.dont_allow(subject))
190
- end
191
-
192
- context "when passed a second argument_expectation" do
193
- it "creates a mock Double for method" do
194
- creates_double_with_method_name(creator.dont_allow(subject, :foobar))
195
- end
196
-
197
- it "creates a mock Double for method" do
198
- creates_double_with_method_name(creator.dont_call(subject, :foobar))
199
- end
200
-
201
- it "creates a mock Double for method" do
202
- creates_double_with_method_name(creator.do_not_allow(subject, :foobar))
203
- end
204
-
205
- it "creates a mock Double for method" do
206
- creates_double_with_method_name(creator.dont_allow(subject, :foobar))
207
- end
208
-
209
- def creates_double_with_method_name(double)
210
- double.with(1, 2)
211
- double.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
212
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
213
- double.argument_expectation.expected_arguments.should == [1, 2]
214
-
215
- lambda do
216
- subject.foobar(1, 2)
217
- end.should raise_error(Errors::TimesCalledError)
218
- reset
219
- nil
220
- end
221
- end
222
-
223
- def creates_dont_allow_call_chain(creator)
224
- double = creator.foobar(1, 2)
225
- double.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
226
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
227
- double.argument_expectation.expected_arguments.should == [1, 2]
228
-
229
- lambda do
230
- subject.foobar(1, 2)
231
- end.should raise_error(Errors::TimesCalledError)
232
- reset
233
- nil
234
- end
235
-
236
- context "when passed method_name and block" do
237
- it "raises error" do
238
- lambda do
239
- @creator.dont_allow(@object, :foobar) {}
240
- end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
241
- end
242
- end
243
- end
244
-
245
- describe "(#proxy or #proxy) and #stub" do
246
- before do
247
- class << subject
248
- def foobar(*args)
249
- :original_foobar
250
- end
251
- end
252
- end
253
-
254
- it "raises error when using dont_allow strategy" do
255
- creator.dont_allow
256
- lambda do
257
- creator.proxy
258
- end.should raise_error(
259
- Errors::DoubleDefinitionError,
260
- "Doubles cannot be proxied when using dont_allow strategy"
261
- )
262
- end
263
-
264
- it "sets up the RR proxy call chain" do
265
- double = creator.stub.proxy(subject).foobar(1, 2) {:baz}
266
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
267
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
268
- subject.foobar(1, 2).should == :baz
269
- end
270
-
271
- it "sets up the RR proxy call chain" do
272
- double = creator.stub.proxy(subject).foobar(1, 2) {:baz}
273
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
274
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
275
- subject.foobar(1, 2).should == :baz
276
- end
277
-
278
- context "when passed a second argument" do
279
- it "creates a proxy Double for method" do
280
- double = creator.stub.proxy(subject, :foobar)
281
- double.with(1, 2) {:baz}
282
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
283
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
284
- subject.foobar(1, 2).should == :baz
285
- end
286
-
287
- it "creates a proxy Double for method" do
288
- double = creator.stub.proxy(subject, :foobar)
289
- double.with(1, 2) {:baz}
290
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
291
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
292
- subject.foobar(1, 2).should == :baz
293
- end
294
- end
295
-
296
- it "sets up the DoubleDefinition to be in after_call block_callback_strategy" do
297
- def subject.foobar
298
- :original_implementation_value
299
- end
300
-
301
- args = nil
302
- double = creator.stub.proxy(subject, :foobar).with() do |*args|
303
- args = args
304
- end
305
- subject.foobar
306
- args.should == [:original_implementation_value]
307
- double.block_callback_strategy.should == :after_call
308
- end
309
-
310
- context "when passed method_name and block" do
311
- it "raises error" do
312
- lambda do
313
- @creator.proxy(@object, :foobar) {}
314
- end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
315
- end
316
- end
317
- end
318
-
319
- describe "#instance_of" do
320
- it "raises an error when not passed a class" do
321
- lambda do
322
- creator.instance_of(Object.new)
323
- end.should raise_error(ArgumentError, "instance_of only accepts class objects")
324
- end
325
-
326
- it "sets up the RR proxy call chain" do
327
- klass = Class.new
328
- double = creator.stub.instance_of(klass).foobar(1, 2) {:baz}
329
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
330
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
331
- klass.new.foobar(1, 2).should == :baz
332
- end
333
-
334
- context "when passed a second argument" do
335
- it "creates a proxy Double for method" do
336
- klass = Class.new
337
- double = creator.stub.instance_of(klass, :foobar)
338
- double.with(1, 2) {:baz}
339
- double.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
340
- double.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
341
- klass.new.foobar(1, 2).should == :baz
342
- end
343
- end
344
-
345
- it "raises error" do
346
- klass = Class.new
347
- lambda do
348
- @creator.instance_of(klass, :foobar) {}
349
- end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
350
- end
351
- end
352
-
353
- describe "#create using no strategy" do
354
- it "raises error" do
355
- lambda do
356
- creator.create(subject, :foobar, 1, 2)
357
- end.should raise_error(
358
- Errors::DoubleDefinitionError,
359
- "This Double has no strategy"
360
- )
361
- end
362
- end
363
-
364
- describe "#create using mock strategy" do
365
- before do
366
- creator.mock
367
- end
368
-
369
- it "sets expectations on the subject" do
370
- creator.create(subject, :foobar, 1, 2) {:baz}.twice
371
-
372
- subject.foobar(1, 2).should == :baz
373
- subject.foobar(1, 2).should == :baz
374
- lambda {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
375
- end
376
- end
377
-
378
- describe "#create using stub strategy" do
379
- before do
380
- creator.stub
381
- end
382
-
383
- it "stubs the subject without any args" do
384
- creator.create(subject, :foobar) {:baz}
385
- subject.foobar.should == :baz
386
- end
387
-
388
- it "stubs the subject mapping passed in args with the output" do
389
- creator.create(subject, :foobar, 1, 2) {:one_two}
390
- creator.create(subject, :foobar, 1) {:one}
391
- creator.create(subject, :foobar) {:nothing}
392
- subject.foobar.should == :nothing
393
- subject.foobar(1).should == :one
394
- subject.foobar(1, 2).should == :one_two
395
- end
396
- end
397
-
398
- describe "#create using dont_allow strategy" do
399
- before do
400
- creator.dont_allow
401
- end
402
-
403
- it "sets expectation for method to never be called with any arguments when on arguments passed in" do
404
- creator.create(subject, :foobar)
405
- lambda {subject.foobar}.should raise_error(Errors::TimesCalledError)
406
- lambda {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
407
- end
408
-
409
- it "sets expectation for method to never be called with passed in arguments" do
410
- creator.create(subject, :foobar, 1, 2)
411
- lambda {subject.foobar}.should raise_error(Errors::DoubleNotFoundError)
412
- lambda {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
413
- end
414
-
415
- it "sets expectation for method to never be called with no arguments when with_no_args is set" do
416
- creator.create(subject, :foobar).with_no_args
417
- lambda {subject.foobar}.should raise_error(Errors::TimesCalledError)
418
- lambda {subject.foobar(1, 2)}.should raise_error(Errors::DoubleNotFoundError)
419
- end
420
- end
421
-
422
- describe "#create using mock strategy with proxy" do
423
- before do
424
- creator.mock
425
- creator.proxy
426
- end
427
-
428
- it "sets expectations on the subject while calling the original method" do
429
- def subject.foobar(*args)
430
- ; :baz;
431
- end
432
- creator.create(subject, :foobar, 1, 2).twice
433
- subject.foobar(1, 2).should == :baz
434
- subject.foobar(1, 2).should == :baz
435
- lambda {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
436
- end
437
-
438
- it "sets after_call on the double when passed a block" do
439
- real_value = Object.new
440
- (class << subject; self; end).class_eval do
441
- define_method(:foobar) {real_value}
442
- end
443
- creator.create(subject, :foobar, 1, 2) do |value|
444
- mock(value).a_method {99}
445
- value
446
- end
447
-
448
- return_value = subject.foobar(1, 2)
449
- return_value.should === return_value
450
- return_value.a_method.should == 99
451
- end
452
- end
453
-
454
- describe "#create using stub strategy with proxy" do
455
- before do
456
- creator.stub
457
- creator.proxy
458
- end
459
-
460
- it "sets up a double with passed in arguments" do
461
- def subject.foobar(*args)
462
- :baz
463
- end
464
- creator.create(subject, :foobar, 1, 2)
465
- lambda do
466
- subject.foobar
467
- end.should raise_error(Errors::DoubleNotFoundError)
468
- end
469
-
470
- it "sets expectations on the subject while calling the original method" do
471
- def subject.foobar(*args)
472
- :baz
473
- end
474
- creator.create(subject, :foobar, 1, 2) {:new_value}
475
- 10.times do
476
- subject.foobar(1, 2).should == :new_value
477
- end
478
- end
479
-
480
- it "sets after_call on the double when passed a block" do
481
- real_value = Object.new
482
- (class << subject; self; end).class_eval do
483
- define_method(:foobar) {real_value}
484
- end
485
- creator.create(subject, :foobar, 1, 2) do |value|
486
- mock(value).a_method {99}
487
- value
488
- end
489
-
490
- return_value = subject.foobar(1, 2)
491
- return_value.should === return_value
492
- return_value.a_method.should == 99
493
- end
494
- end
495
- end
496
- end