rr 0.3.11 → 0.4.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 +8 -3
- data/README +130 -39
- data/Rakefile +6 -5
- data/lib/rr.rb +8 -8
- data/lib/rr/adapters/rr_methods.rb +228 -0
- data/lib/rr/adapters/rspec.rb +1 -1
- data/lib/rr/adapters/test_unit.rb +1 -1
- data/lib/rr/double.rb +294 -89
- data/lib/rr/{scenario_creator.rb → double_creator.rb} +65 -66
- data/lib/rr/{scenario_definition.rb → double_definition.rb} +36 -36
- data/lib/rr/{scenario_definition_builder.rb → double_definition_builder.rb} +3 -3
- data/lib/rr/double_insertion.rb +132 -0
- data/lib/rr/{scenario_matches.rb → double_matches.rb} +2 -2
- data/lib/rr/{scenario_method_proxy.rb → double_method_proxy.rb} +2 -2
- data/lib/rr/errors/argument_equality_error.rb +3 -3
- data/lib/rr/errors/rr_error.rb +13 -13
- data/lib/rr/errors/scenario_definition_error.rb +3 -3
- data/lib/rr/errors/scenario_not_found_error.rb +3 -3
- data/lib/rr/errors/scenario_order_error.rb +3 -3
- data/lib/rr/errors/times_called_error.rb +3 -3
- data/lib/rr/expectations/any_argument_expectation.rb +1 -1
- data/lib/rr/expectations/argument_equality_expectation.rb +1 -1
- data/lib/rr/expectations/times_called_expectation.rb +1 -1
- data/lib/rr/hash_with_object_id_key.rb +1 -1
- data/lib/rr/space.rb +40 -40
- data/lib/rr/times_called_matchers/any_times_matcher.rb +13 -13
- data/lib/rr/times_called_matchers/at_least_matcher.rb +11 -11
- data/lib/rr/times_called_matchers/at_most_matcher.rb +16 -16
- data/lib/rr/times_called_matchers/integer_matcher.rb +13 -13
- data/lib/rr/times_called_matchers/non_terminal.rb +21 -21
- data/lib/rr/times_called_matchers/proc_matcher.rb +7 -7
- data/lib/rr/times_called_matchers/range_matcher.rb +14 -14
- data/lib/rr/times_called_matchers/terminal.rb +16 -16
- data/lib/rr/times_called_matchers/times_called_matcher.rb +32 -32
- data/spec/core_spec_suite.rb +18 -0
- data/{examples → spec}/environment_fixture_setup.rb +0 -1
- data/{examples/high_level_example.rb → spec/high_level_spec.rb} +11 -11
- data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +67 -0
- data/spec/rr/adapters/rr_methods_creator_spec.rb +365 -0
- data/spec/rr/adapters/rr_methods_space_spec.rb +134 -0
- data/spec/rr/adapters/rr_methods_spec_helper.rb +11 -0
- data/{examples/rr/extensions/instance_methods_times_matcher_example.rb → spec/rr/adapters/rr_methods_times_matcher_spec.rb} +4 -4
- data/spec/rr/double/double_insertion_bind_spec.rb +78 -0
- data/spec/rr/double/double_insertion_dispatching_spec.rb +221 -0
- data/spec/rr/double/double_insertion_has_original_method_spec.rb +56 -0
- data/spec/rr/double/double_insertion_register_scenario_spec.rb +24 -0
- data/spec/rr/double/double_insertion_reset_spec.rb +89 -0
- data/spec/rr/double/double_insertion_spec.rb +66 -0
- data/spec/rr/double/double_insertion_verify_spec.rb +23 -0
- data/spec/rr/double_creator_spec.rb +454 -0
- data/{examples/rr/scenario_definition_example.rb → spec/rr/double_definition_spec.rb} +143 -143
- data/spec/rr/double_method_proxy_spec.rb +71 -0
- data/spec/rr/double_spec.rb +654 -0
- data/spec/rr/errors/rr_error_spec.rb +65 -0
- data/spec/rr/expectations/any_argument_expectation_spec.rb +47 -0
- data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +38 -0
- data/spec/rr/expectations/argument_equality_expectation_spec.rb +58 -0
- data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +53 -0
- data/spec/rr/expectations/duck_type_argument_equality_expectation_spec.rb +71 -0
- data/spec/rr/expectations/is_a_argument_equality_expectation_spec.rb +51 -0
- data/spec/rr/expectations/numeric_argument_equality_expectation_spec.rb +47 -0
- data/spec/rr/expectations/range_argument_equality_expectation_spec.rb +59 -0
- data/spec/rr/expectations/regexp_argument_equality_expectation_spec.rb +72 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +43 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +67 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +71 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +21 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +103 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +79 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +81 -0
- data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +40 -0
- data/spec/rr/rspec/rspec_adapter_spec.rb +65 -0
- data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +52 -0
- data/spec/rr/rspec/rspec_usage_spec.rb +67 -0
- data/spec/rr/space/hash_with_object_id_key_spec.rb +88 -0
- data/spec/rr/space/space_create_spec.rb +278 -0
- data/spec/rr/space/space_helper.rb +7 -0
- data/spec/rr/space/space_register_spec.rb +32 -0
- data/spec/rr/space/space_reset_spec.rb +131 -0
- data/spec/rr/space/space_spec.rb +32 -0
- data/spec/rr/space/space_verify_spec.rb +181 -0
- data/{examples → spec}/rr/test_unit/test_helper.rb +1 -1
- data/{examples → spec}/rr/test_unit/test_unit_backtrace_test.rb +0 -0
- data/{examples → spec}/rr/test_unit/test_unit_integration_test.rb +4 -4
- data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +47 -0
- data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +55 -0
- data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +70 -0
- data/spec/rr/times_called_matchers/integer_matcher_spec.rb +70 -0
- data/spec/rr/times_called_matchers/proc_matcher_spec.rb +55 -0
- data/spec/rr/times_called_matchers/range_matcher_spec.rb +76 -0
- data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +118 -0
- data/spec/rspec_spec_suite.rb +16 -0
- data/spec/spec_helper.rb +9 -0
- data/{examples/example_suite.rb → spec/spec_suite.rb} +3 -3
- data/{examples/test_unit_example_suite.rb → spec/test_unit_spec_suite.rb} +0 -0
- metadata +93 -93
- data/examples/core_example_suite.rb +0 -31
- data/examples/example_helper.rb +0 -9
- data/examples/rr/double/double_bind_example.rb +0 -70
- data/examples/rr/double/double_dispatching_example.rb +0 -236
- data/examples/rr/double/double_example.rb +0 -66
- data/examples/rr/double/double_has_original_method_example.rb +0 -56
- data/examples/rr/double/double_register_scenario_example.rb +0 -24
- data/examples/rr/double/double_reset_example.rb +0 -89
- data/examples/rr/double/double_verify_example.rb +0 -23
- data/examples/rr/errors/rr_error_example.rb +0 -65
- data/examples/rr/expectations/any_argument_expectation_example.rb +0 -52
- data/examples/rr/expectations/anything_argument_equality_expectation_example.rb +0 -38
- data/examples/rr/expectations/argument_equality_expectation_example.rb +0 -62
- data/examples/rr/expectations/boolean_argument_equality_expectation_example.rb +0 -48
- data/examples/rr/expectations/duck_type_argument_equality_expectation_example.rb +0 -67
- data/examples/rr/expectations/is_a_argument_equality_expectation_example.rb +0 -50
- data/examples/rr/expectations/numeric_argument_equality_expectation_example.rb +0 -46
- data/examples/rr/expectations/range_argument_equality_expectation_example.rb +0 -59
- data/examples/rr/expectations/regexp_argument_equality_expectation_example.rb +0 -67
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_any_times_example.rb +0 -50
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_least_example.rb +0 -73
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb +0 -77
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_example.rb +0 -42
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +0 -20
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb +0 -111
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb +0 -88
- data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb +0 -90
- data/examples/rr/extensions/instance_methods_argument_matcher_example.rb +0 -65
- data/examples/rr/extensions/instance_methods_creator_example.rb +0 -363
- data/examples/rr/extensions/instance_methods_example_helper.rb +0 -11
- data/examples/rr/extensions/instance_methods_space_example.rb +0 -122
- data/examples/rr/rspec/rspec_adapter_example.rb +0 -63
- data/examples/rr/rspec/rspec_backtrace_tweaking_example.rb +0 -36
- data/examples/rr/rspec/rspec_usage_example.rb +0 -65
- data/examples/rr/scenario_creator_example.rb +0 -459
- data/examples/rr/scenario_example.rb +0 -701
- data/examples/rr/scenario_method_proxy_example.rb +0 -71
- data/examples/rr/space/hash_with_object_id_key_example.rb +0 -86
- data/examples/rr/space/space_create_example.rb +0 -278
- data/examples/rr/space/space_example.rb +0 -29
- data/examples/rr/space/space_helper.rb +0 -7
- data/examples/rr/space/space_register_example.rb +0 -32
- data/examples/rr/space/space_reset_example.rb +0 -120
- data/examples/rr/space/space_verify_example.rb +0 -169
- data/examples/rr/times_called_matchers/any_times_matcher_example.rb +0 -63
- data/examples/rr/times_called_matchers/at_least_matcher_example.rb +0 -70
- data/examples/rr/times_called_matchers/at_most_matcher_example.rb +0 -85
- data/examples/rr/times_called_matchers/integer_matcher_example.rb +0 -91
- data/examples/rr/times_called_matchers/proc_matcher_example.rb +0 -77
- data/examples/rr/times_called_matchers/range_matcher_example.rb +0 -97
- data/examples/rr/times_called_matchers/times_called_matcher_example.rb +0 -53
- data/examples/rspec_example_suite.rb +0 -25
- data/lib/rr/extensions/instance_methods.rb +0 -228
- data/lib/rr/scenario.rb +0 -337
@@ -1,20 +1,20 @@
|
|
1
1
|
module RR
|
2
|
-
module TimesCalledMatchers
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
2
|
+
module TimesCalledMatchers
|
3
|
+
# Including this module marks the TimesCalledMatcher as Terminal.
|
4
|
+
# Being Terminal the Double will "terminate" when times called is
|
5
|
+
# finite.
|
6
|
+
#
|
7
|
+
# The Double that uses a Terminal TimesCalledMatcher will
|
8
|
+
# eventually be passed over to the next Double when passed
|
9
|
+
# the matching arguments enough times. This is done by the attempt?
|
10
|
+
# method returning false when executed a finite number of times.
|
11
|
+
#
|
12
|
+
# This is in opposition to NonTerminal TimesCalledMatchers, where
|
13
|
+
# attempt? will always return true.
|
14
|
+
module Terminal #:nodoc:
|
15
|
+
def terminal?
|
16
|
+
true
|
17
|
+
end
|
17
18
|
end
|
18
19
|
end
|
19
|
-
end
|
20
20
|
end
|
@@ -1,44 +1,44 @@
|
|
1
1
|
module RR
|
2
|
-
module TimesCalledMatchers
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
2
|
+
module TimesCalledMatchers
|
3
|
+
class TimesCalledMatcher #:nodoc:
|
4
|
+
class << self
|
5
|
+
def create(value)
|
6
|
+
return value if value.is_a?(TimesCalledMatcher)
|
7
|
+
return IntegerMatcher.new(value) if value.is_a?(Integer)
|
8
|
+
return RangeMatcher.new(value) if value.is_a?(Range )
|
9
|
+
return ProcMatcher.new(value) if value.is_a?(Proc)
|
10
|
+
raise ArgumentError, "There is no TimesCalledMatcher for #{value.inspect}."
|
11
|
+
end
|
11
12
|
end
|
12
|
-
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
def initialize(times)
|
17
|
-
@times = times
|
18
|
-
end
|
14
|
+
attr_reader :times
|
19
15
|
|
20
|
-
|
21
|
-
|
16
|
+
def initialize(times)
|
17
|
+
@times = times
|
18
|
+
end
|
22
19
|
|
23
|
-
|
24
|
-
|
20
|
+
def matches?(times_called)
|
21
|
+
end
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
23
|
+
def attempt?(times_called)
|
24
|
+
end
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
def error_message(times_called)
|
27
|
+
"Called #{times_called.inspect} #{pluralized_time(times_called)}.\n#{expected_message_part}"
|
28
|
+
end
|
33
29
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
30
|
+
def ==(other)
|
31
|
+
self.class == other.class && self.times == other.times
|
32
|
+
end
|
38
33
|
|
39
|
-
|
40
|
-
|
34
|
+
protected
|
35
|
+
def expected_message_part
|
36
|
+
"Expected #{@times.inspect} times."
|
37
|
+
end
|
38
|
+
|
39
|
+
def pluralized_time(times_called)
|
40
|
+
(times_called == 1) ? "time" : "times"
|
41
|
+
end
|
41
42
|
end
|
42
43
|
end
|
43
|
-
end
|
44
44
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "spec"
|
3
|
+
|
4
|
+
class CoreExampleSuite
|
5
|
+
def run
|
6
|
+
files = Dir["#{File.dirname(__FILE__)}/**/*_spec.rb"]
|
7
|
+
files.delete_if {|file| file.include?('rspec/')}
|
8
|
+
files.delete_if {|file| file.include?('test_unit/')}
|
9
|
+
puts "Running Rspec Example Suite"
|
10
|
+
files.each do |file|
|
11
|
+
require file
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
if $0 == __FILE__
|
17
|
+
CoreExampleSuite.new.run
|
18
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
dir = File.dirname(__FILE__)
|
2
|
-
require "#{dir}/
|
2
|
+
require "#{dir}/spec_helper"
|
3
3
|
|
4
4
|
describe "RR", :shared => true do
|
5
5
|
before(:each) do
|
6
6
|
@obj = Object.new
|
7
|
-
extend RR::
|
7
|
+
extend RR::Adapters::RRMethods
|
8
8
|
end
|
9
9
|
|
10
10
|
after(:each) do
|
@@ -58,26 +58,26 @@ describe "RR mock:" do
|
|
58
58
|
).should == "value 1"
|
59
59
|
proc do
|
60
60
|
@obj.foobar(:failure)
|
61
|
-
end.should raise_error( RR::Errors::
|
61
|
+
end.should raise_error( RR::Errors::DoubleNotFoundError )
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
describe "RR
|
65
|
+
describe "RR proxy:" do
|
66
66
|
it_should_behave_like "RR"
|
67
67
|
|
68
|
-
it "
|
68
|
+
it "proxies via inline call" do
|
69
69
|
expected_to_s_value = @obj.to_s
|
70
|
-
mock.
|
70
|
+
mock.proxy(@obj).to_s
|
71
71
|
@obj.to_s.should == expected_to_s_value
|
72
72
|
proc {@obj.to_s}.should raise_error
|
73
73
|
end
|
74
74
|
|
75
|
-
it "
|
75
|
+
it "proxy allows ordering" do
|
76
76
|
def @obj.to_s(arg)
|
77
77
|
"Original to_s with arg #{arg}"
|
78
78
|
end
|
79
|
-
mock.
|
80
|
-
mock.
|
79
|
+
mock.proxy(@obj).to_s(:foo).ordered
|
80
|
+
mock.proxy(@obj).to_s(:bar).twice.ordered
|
81
81
|
|
82
82
|
@obj.to_s(:foo).should == "Original to_s with arg foo"
|
83
83
|
@obj.to_s(:bar).should == "Original to_s with arg bar"
|
@@ -98,7 +98,7 @@ describe "RR probe or proxy:" do
|
|
98
98
|
proc {@obj.to_s(:bar)}.should raise_error(RR::Errors::TimesCalledError)
|
99
99
|
end
|
100
100
|
|
101
|
-
it "
|
101
|
+
it "proxies via block" do
|
102
102
|
def @obj.foobar_1(*args)
|
103
103
|
:original_value_1
|
104
104
|
end
|
@@ -107,7 +107,7 @@ describe "RR probe or proxy:" do
|
|
107
107
|
:original_value_2
|
108
108
|
end
|
109
109
|
|
110
|
-
mock.
|
110
|
+
mock.proxy @obj do |c|
|
111
111
|
c.foobar_1(1)
|
112
112
|
c.foobar_2
|
113
113
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "spec/spec_helper"
|
2
|
+
|
3
|
+
module RR
|
4
|
+
module Adapters
|
5
|
+
describe RRMethods do
|
6
|
+
describe "#anything" do
|
7
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
8
|
+
|
9
|
+
it "returns an Anything matcher" do
|
10
|
+
anything.should == WildcardMatchers::Anything.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it "rr_anything returns an Anything matcher" do
|
14
|
+
rr_anything.should == WildcardMatchers::Anything.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#is_a" do
|
19
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
20
|
+
|
21
|
+
it "returns an IsA matcher" do
|
22
|
+
is_a(Integer).should == WildcardMatchers::IsA.new(Integer)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "rr_is_a returns an IsA matcher" do
|
26
|
+
rr_is_a(Integer).should == WildcardMatchers::IsA.new(Integer)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#numeric" do
|
31
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
32
|
+
|
33
|
+
it "returns an Numeric matcher" do
|
34
|
+
numeric.should == WildcardMatchers::Numeric.new
|
35
|
+
end
|
36
|
+
|
37
|
+
it "rr_numeric returns an Numeric matcher" do
|
38
|
+
rr_numeric.should == WildcardMatchers::Numeric.new
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "#boolean" do
|
43
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
44
|
+
|
45
|
+
it "returns an Boolean matcher" do
|
46
|
+
boolean.should == WildcardMatchers::Boolean.new
|
47
|
+
end
|
48
|
+
|
49
|
+
it "rr_boolean returns an Boolean matcher" do
|
50
|
+
rr_boolean.should == WildcardMatchers::Boolean.new
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#duck_type" do
|
55
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
56
|
+
|
57
|
+
it "returns a DuckType matcher" do
|
58
|
+
duck_type(:one, :two).should == WildcardMatchers::DuckType.new(:one, :two)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "rr_duck_type returns a DuckType matcher" do
|
62
|
+
rr_duck_type(:one, :two).should == WildcardMatchers::DuckType.new(:one, :two)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,365 @@
|
|
1
|
+
require "spec/spec_helper"
|
2
|
+
|
3
|
+
module RR
|
4
|
+
module Adapters
|
5
|
+
describe RRMethods do
|
6
|
+
describe "#mock" do
|
7
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
8
|
+
|
9
|
+
before do
|
10
|
+
@subject = Object.new
|
11
|
+
class << @subject
|
12
|
+
def foobar(*args)
|
13
|
+
:original_value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns a DoubleCreator when passed no arguments" do
|
19
|
+
mock.should be_instance_of(DoubleCreator)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "sets up the RR mock call chain" do
|
23
|
+
creates_mock_call_chain(mock(@subject))
|
24
|
+
end
|
25
|
+
|
26
|
+
it "#rr_mock sets up the RR mock call chain" do
|
27
|
+
creates_mock_call_chain(rr_mock(@subject))
|
28
|
+
end
|
29
|
+
|
30
|
+
it "creates a mock Double for method when passed a second argument" do
|
31
|
+
creates_scenario_with_method_name(mock(@subject, :foobar))
|
32
|
+
end
|
33
|
+
|
34
|
+
it "creates a mock Double for method when passed a second argument with rr_mock" do
|
35
|
+
creates_scenario_with_method_name(rr_mock(@subject, :foobar))
|
36
|
+
end
|
37
|
+
|
38
|
+
it "raises error if passed a method name and a block" do
|
39
|
+
proc do
|
40
|
+
mock(@object, :foobar) {}
|
41
|
+
end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
|
42
|
+
end
|
43
|
+
|
44
|
+
def creates_scenario_with_method_name(scenario)
|
45
|
+
scenario.with(1, 2) {:baz}
|
46
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
|
47
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
48
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
49
|
+
|
50
|
+
@subject.foobar(1, 2).should == :baz
|
51
|
+
end
|
52
|
+
|
53
|
+
def creates_mock_call_chain(creator)
|
54
|
+
scenario = creator.foobar(1, 2) {:baz}
|
55
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
|
56
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
57
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
58
|
+
|
59
|
+
@subject.foobar(1, 2).should == :baz
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#stub" do
|
64
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
65
|
+
|
66
|
+
before do
|
67
|
+
@subject = Object.new
|
68
|
+
class << @subject
|
69
|
+
def foobar(*args)
|
70
|
+
:original_value
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns a DoubleCreator when passed no arguments" do
|
76
|
+
stub.should be_instance_of(DoubleCreator)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "sets up the RR stub call chain" do
|
80
|
+
creates_stub_call_chain(stub(@subject))
|
81
|
+
end
|
82
|
+
|
83
|
+
it "#rr_stub sets up the RR stub call chain" do
|
84
|
+
creates_stub_call_chain(rr_stub(@subject))
|
85
|
+
end
|
86
|
+
|
87
|
+
it "creates a stub Double for method when passed a second argument" do
|
88
|
+
creates_scenario_with_method_name(stub(@subject, :foobar))
|
89
|
+
end
|
90
|
+
|
91
|
+
it "#rr_stub creates a stub Double for method when passed a second argument" do
|
92
|
+
creates_scenario_with_method_name(rr_stub(@subject, :foobar))
|
93
|
+
end
|
94
|
+
|
95
|
+
it "raises error if passed a method name and a block" do
|
96
|
+
proc do
|
97
|
+
stub(@object, :foobar) {}
|
98
|
+
end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
|
99
|
+
end
|
100
|
+
|
101
|
+
def creates_scenario_with_method_name(scenario)
|
102
|
+
scenario.with(1, 2) {:baz}
|
103
|
+
scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
|
104
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
105
|
+
@subject.foobar(1, 2).should == :baz
|
106
|
+
end
|
107
|
+
|
108
|
+
def creates_stub_call_chain(creator)
|
109
|
+
scenario = creator.foobar(1, 2) {:baz}
|
110
|
+
scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
|
111
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
112
|
+
@subject.foobar(1, 2).should == :baz
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#proxy and #mock" do
|
117
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
118
|
+
|
119
|
+
before do
|
120
|
+
@subject = Object.new
|
121
|
+
class << @subject
|
122
|
+
def foobar(*args)
|
123
|
+
:original_value
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
it "#proxy returns a DoubleCreator when passed no arguments" do
|
129
|
+
proxy.should be_instance_of(DoubleCreator)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "#proxy sets up the RR proxy call chain" do
|
133
|
+
creates_mock_proxy_call_chain(mock.proxy(@subject))
|
134
|
+
end
|
135
|
+
|
136
|
+
it "#rr_proxy sets up the RR proxy call chain" do
|
137
|
+
creates_mock_proxy_call_chain(rr_mock.proxy(@subject))
|
138
|
+
end
|
139
|
+
|
140
|
+
it "#mock_proxy sets up the RR proxy call chain" do
|
141
|
+
creates_mock_proxy_call_chain(mock.proxy(@subject))
|
142
|
+
end
|
143
|
+
|
144
|
+
it "#rr_mock_proxy sets up the RR proxy call chain with rr_proxy" do
|
145
|
+
creates_mock_proxy_call_chain(rr_mock.proxy(@subject))
|
146
|
+
end
|
147
|
+
|
148
|
+
it "#proxy creates a mock Double for method when passed a second argument" do
|
149
|
+
creates_scenario_with_method_name(mock.proxy(@subject, :foobar))
|
150
|
+
end
|
151
|
+
|
152
|
+
it "#rr_proxy creates a mock Double for method when passed a second argument with rr_mock" do
|
153
|
+
creates_scenario_with_method_name(rr_proxy.mock(@subject, :foobar))
|
154
|
+
end
|
155
|
+
|
156
|
+
it "#mock_proxy creates a mock Double for method when passed a second argument" do
|
157
|
+
creates_scenario_with_method_name(mock.proxy(@subject, :foobar))
|
158
|
+
end
|
159
|
+
|
160
|
+
it "#rr_mock_proxy creates a mock Double for method when passed a second argument with rr_mock" do
|
161
|
+
creates_scenario_with_method_name(rr_mock.proxy(@subject, :foobar))
|
162
|
+
end
|
163
|
+
|
164
|
+
it "raises error if passed a method name and a block" do
|
165
|
+
proc do
|
166
|
+
mock.proxy(@object, :foobar) {}
|
167
|
+
end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
|
168
|
+
end
|
169
|
+
|
170
|
+
def creates_scenario_with_method_name(scenario)
|
171
|
+
scenario.with(1, 2)
|
172
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
|
173
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
174
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
175
|
+
|
176
|
+
@subject.foobar(1, 2).should == :original_value
|
177
|
+
end
|
178
|
+
|
179
|
+
def creates_mock_proxy_call_chain(creator)
|
180
|
+
scenario = creator.foobar(1, 2)
|
181
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
|
182
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
183
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
184
|
+
|
185
|
+
@subject.foobar(1, 2).should == :original_value
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "#stub and #proxy" do
|
190
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
191
|
+
|
192
|
+
before do
|
193
|
+
@subject = Object.new
|
194
|
+
class << @subject
|
195
|
+
def foobar(*args)
|
196
|
+
:original_value
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
it "returns a DoubleCreator when passed no arguments" do
|
202
|
+
stub.proxy.should be_instance_of(DoubleCreator)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "sets up the RR proxy call chain" do
|
206
|
+
creates_stub_proxy_call_chain(stub.proxy(@subject))
|
207
|
+
end
|
208
|
+
|
209
|
+
it "sets up the RR proxy call chain" do
|
210
|
+
creates_stub_proxy_call_chain(rr_stub.proxy(@subject))
|
211
|
+
end
|
212
|
+
|
213
|
+
it "#stub.proxy creates a stub Double for method when passed a second argument" do
|
214
|
+
creates_scenario_with_method_name(stub.proxy(@subject, :foobar))
|
215
|
+
end
|
216
|
+
|
217
|
+
it "#rr_stub.proxy creates a stub Double for method when passed a second argument with rr_stub" do
|
218
|
+
creates_scenario_with_method_name(rr_stub.proxy(@subject, :foobar))
|
219
|
+
end
|
220
|
+
|
221
|
+
it "raises error if passed a method name and a block" do
|
222
|
+
proc do
|
223
|
+
stub.proxy(@object, :foobar) {}
|
224
|
+
end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
|
225
|
+
end
|
226
|
+
|
227
|
+
def creates_scenario_with_method_name(scenario)
|
228
|
+
scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
|
229
|
+
scenario.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
|
230
|
+
|
231
|
+
@subject.foobar(:something).should == :original_value
|
232
|
+
end
|
233
|
+
|
234
|
+
def creates_stub_proxy_call_chain(creator)
|
235
|
+
scenario = creator.foobar
|
236
|
+
scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
|
237
|
+
scenario.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
|
238
|
+
|
239
|
+
@subject.foobar(1, 2).should == :original_value
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
describe "#do_not_allow" do
|
244
|
+
it_should_behave_like "RR::Adapters::RRMethods"
|
245
|
+
|
246
|
+
before do
|
247
|
+
@subject = Object.new
|
248
|
+
class << @subject
|
249
|
+
def foobar(*args)
|
250
|
+
:original_value
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
it "returns a DoubleCreator when passed no arguments" do
|
256
|
+
do_not_allow.should be_instance_of(DoubleCreator)
|
257
|
+
end
|
258
|
+
|
259
|
+
it "sets up the RR do_not_allow call chain" do
|
260
|
+
creates_do_not_allow_call_chain(dont_allow(@subject))
|
261
|
+
creates_do_not_allow_call_chain(rr_dont_allow(@subject))
|
262
|
+
creates_do_not_allow_call_chain(dont_call(@subject))
|
263
|
+
creates_do_not_allow_call_chain(rr_dont_call(@subject))
|
264
|
+
creates_do_not_allow_call_chain(do_not_allow(@subject))
|
265
|
+
creates_do_not_allow_call_chain(rr_do_not_allow(@subject))
|
266
|
+
creates_do_not_allow_call_chain(dont_allow(@subject))
|
267
|
+
creates_do_not_allow_call_chain(rr_dont_allow(@subject))
|
268
|
+
end
|
269
|
+
|
270
|
+
it "creates a mock Double for method when passed a second argument" do
|
271
|
+
creates_scenario_with_method_name(dont_allow(@subject, :foobar))
|
272
|
+
creates_scenario_with_method_name(rr_dont_allow(@subject, :foobar))
|
273
|
+
creates_scenario_with_method_name(dont_call(@subject, :foobar))
|
274
|
+
creates_scenario_with_method_name(rr_dont_call(@subject, :foobar))
|
275
|
+
creates_scenario_with_method_name(do_not_allow(@subject, :foobar))
|
276
|
+
creates_scenario_with_method_name(rr_do_not_allow(@subject, :foobar))
|
277
|
+
creates_scenario_with_method_name(dont_allow(@subject, :foobar))
|
278
|
+
creates_scenario_with_method_name(rr_dont_allow(@subject, :foobar))
|
279
|
+
end
|
280
|
+
|
281
|
+
it "raises error if passed a method name and a block" do
|
282
|
+
proc do
|
283
|
+
do_not_allow(@object, :foobar) {}
|
284
|
+
end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
|
285
|
+
end
|
286
|
+
|
287
|
+
def creates_scenario_with_method_name(scenario)
|
288
|
+
scenario.with(1, 2)
|
289
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
|
290
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
291
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
292
|
+
|
293
|
+
proc do
|
294
|
+
@subject.foobar(1, 2)
|
295
|
+
end.should raise_error(Errors::TimesCalledError)
|
296
|
+
reset
|
297
|
+
nil
|
298
|
+
end
|
299
|
+
|
300
|
+
def creates_do_not_allow_call_chain(creator)
|
301
|
+
scenario = creator.foobar(1, 2)
|
302
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
|
303
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
304
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
305
|
+
|
306
|
+
proc do
|
307
|
+
@subject.foobar(1, 2)
|
308
|
+
end.should raise_error(Errors::TimesCalledError)
|
309
|
+
reset
|
310
|
+
nil
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
describe DoubleCreator, "#instance_of and #mock" do
|
315
|
+
before do
|
316
|
+
@klass = Class.new
|
317
|
+
end
|
318
|
+
|
319
|
+
it "returns a DoubleCreator when passed no arguments" do
|
320
|
+
instance_of.instance_of.should be_instance_of(DoubleCreator)
|
321
|
+
end
|
322
|
+
|
323
|
+
it "sets up the RR instance_of call chain" do
|
324
|
+
creates_instance_of_call_chain(instance_of.mock(@klass))
|
325
|
+
end
|
326
|
+
|
327
|
+
it "#rr_instance_of sets up the RR instance_of call chain" do
|
328
|
+
creates_instance_of_call_chain(rr_instance_of.mock(@klass))
|
329
|
+
end
|
330
|
+
|
331
|
+
it "creates a instance_of Double for method when passed a second argument" do
|
332
|
+
creates_scenario_with_method_name(instance_of.mock(@klass, :foobar))
|
333
|
+
end
|
334
|
+
|
335
|
+
it "creates a instance_of Double for method when passed a second argument with rr_instance_of" do
|
336
|
+
creates_scenario_with_method_name(rr_instance_of.mock(@klass, :foobar))
|
337
|
+
end
|
338
|
+
|
339
|
+
it "raises error if passed a method name and a block" do
|
340
|
+
proc do
|
341
|
+
instance_of.mock(@klass, :foobar) {}
|
342
|
+
end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
|
343
|
+
end
|
344
|
+
|
345
|
+
def creates_scenario_with_method_name(scenario)
|
346
|
+
scenario.with(1, 2) {:baz}
|
347
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
|
348
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
349
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
350
|
+
|
351
|
+
@klass.new.foobar(1, 2).should == :baz
|
352
|
+
end
|
353
|
+
|
354
|
+
def creates_instance_of_call_chain(creator)
|
355
|
+
scenario = creator.foobar(1, 2) {:baz}
|
356
|
+
scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
|
357
|
+
scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
|
358
|
+
scenario.argument_expectation.expected_arguments.should == [1, 2]
|
359
|
+
|
360
|
+
@klass.new.foobar(1, 2).should == :baz
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|