opal-rspec-cj 0.4.4
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.gitmodules +15 -0
- data/.travis.yml +13 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile +8 -0
- data/README.md +147 -0
- data/Rakefile +26 -0
- data/config.ru +10 -0
- data/example/Gemfile +4 -0
- data/example/README.md +13 -0
- data/example/Rakefile +8 -0
- data/example/opal/user.rb +11 -0
- data/example/spec/user_spec.rb +15 -0
- data/lib/opal-rspec.rb +2 -0
- data/lib/opal/rspec.rb +20 -0
- data/lib/opal/rspec/rake_task.rb +63 -0
- data/lib/opal/rspec/version.rb +5 -0
- data/opal-rspec.gemspec +21 -0
- data/opal/opal-rspec.rb +1 -0
- data/opal/opal/rspec.rb +25 -0
- data/opal/opal/rspec/async.rb +289 -0
- data/opal/opal/rspec/browser_formatter.rb +188 -0
- data/opal/opal/rspec/fixes.rb +116 -0
- data/opal/opal/rspec/requires.rb +45 -0
- data/opal/opal/rspec/runner.rb +69 -0
- data/opal/opal/rspec/sprockets_runner.rb.erb +11 -0
- data/opal/opal/rspec/text_formatter.rb +74 -0
- data/spec/async_spec.rb +38 -0
- data/spec/example_spec.rb +163 -0
- data/spec/matchers_spec.rb +201 -0
- data/spec/mock_spec.rb +63 -0
- data/spec/named_subject_spec.rb +11 -0
- data/spec/should_syntax_spec.rb +17 -0
- data/vendor/spec_runner.js +50 -0
- data/vendor_lib/rspec-expectations.rb +1 -0
- data/vendor_lib/rspec.rb +3 -0
- data/vendor_lib/rspec/autorun.rb +2 -0
- data/vendor_lib/rspec/core.rb +203 -0
- data/vendor_lib/rspec/core/backport_random.rb +302 -0
- data/vendor_lib/rspec/core/backtrace_formatter.rb +65 -0
- data/vendor_lib/rspec/core/command_line.rb +36 -0
- data/vendor_lib/rspec/core/configuration.rb +1129 -0
- data/vendor_lib/rspec/core/configuration_options.rb +143 -0
- data/vendor_lib/rspec/core/drb_command_line.rb +26 -0
- data/vendor_lib/rspec/core/drb_options.rb +87 -0
- data/vendor_lib/rspec/core/dsl.rb +26 -0
- data/vendor_lib/rspec/core/example.rb +312 -0
- data/vendor_lib/rspec/core/example_group.rb +540 -0
- data/vendor_lib/rspec/core/filter_manager.rb +224 -0
- data/vendor_lib/rspec/core/flat_map.rb +17 -0
- data/vendor_lib/rspec/core/formatters.rb +54 -0
- data/vendor_lib/rspec/core/formatters/base_formatter.rb +291 -0
- data/vendor_lib/rspec/core/formatters/base_text_formatter.rb +307 -0
- data/vendor_lib/rspec/core/formatters/deprecation_formatter.rb +193 -0
- data/vendor_lib/rspec/core/formatters/documentation_formatter.rb +67 -0
- data/vendor_lib/rspec/core/formatters/helpers.rb +82 -0
- data/vendor_lib/rspec/core/formatters/html_formatter.rb +155 -0
- data/vendor_lib/rspec/core/formatters/html_printer.rb +408 -0
- data/vendor_lib/rspec/core/formatters/json_formatter.rb +99 -0
- data/vendor_lib/rspec/core/formatters/progress_formatter.rb +32 -0
- data/vendor_lib/rspec/core/formatters/snippet_extractor.rb +101 -0
- data/vendor_lib/rspec/core/hooks.rb +535 -0
- data/vendor_lib/rspec/core/memoized_helpers.rb +431 -0
- data/vendor_lib/rspec/core/metadata.rb +313 -0
- data/vendor_lib/rspec/core/mocking/with_absolutely_nothing.rb +11 -0
- data/vendor_lib/rspec/core/mocking/with_flexmock.rb +27 -0
- data/vendor_lib/rspec/core/mocking/with_mocha.rb +52 -0
- data/vendor_lib/rspec/core/mocking/with_rr.rb +27 -0
- data/vendor_lib/rspec/core/mocking/with_rspec.rb +27 -0
- data/vendor_lib/rspec/core/option_parser.rb +234 -0
- data/vendor_lib/rspec/core/ordering.rb +154 -0
- data/vendor_lib/rspec/core/pending.rb +110 -0
- data/vendor_lib/rspec/core/project_initializer.rb +88 -0
- data/vendor_lib/rspec/core/rake_task.rb +128 -0
- data/vendor_lib/rspec/core/reporter.rb +132 -0
- data/vendor_lib/rspec/core/ruby_project.rb +44 -0
- data/vendor_lib/rspec/core/runner.rb +97 -0
- data/vendor_lib/rspec/core/shared_context.rb +53 -0
- data/vendor_lib/rspec/core/shared_example_group.rb +146 -0
- data/vendor_lib/rspec/core/shared_example_group/collection.rb +27 -0
- data/vendor_lib/rspec/core/version.rb +7 -0
- data/vendor_lib/rspec/core/warnings.rb +22 -0
- data/vendor_lib/rspec/core/world.rb +131 -0
- data/vendor_lib/rspec/expectations.rb +75 -0
- data/vendor_lib/rspec/expectations/differ.rb +154 -0
- data/vendor_lib/rspec/expectations/errors.rb +9 -0
- data/vendor_lib/rspec/expectations/expectation_target.rb +87 -0
- data/vendor_lib/rspec/expectations/extensions.rb +1 -0
- data/vendor_lib/rspec/expectations/extensions/object.rb +29 -0
- data/vendor_lib/rspec/expectations/fail_with.rb +79 -0
- data/vendor_lib/rspec/expectations/handler.rb +68 -0
- data/vendor_lib/rspec/expectations/syntax.rb +182 -0
- data/vendor_lib/rspec/expectations/version.rb +8 -0
- data/vendor_lib/rspec/matchers.rb +633 -0
- data/vendor_lib/rspec/matchers/built_in.rb +39 -0
- data/vendor_lib/rspec/matchers/built_in/base_matcher.rb +68 -0
- data/vendor_lib/rspec/matchers/built_in/be.rb +213 -0
- data/vendor_lib/rspec/matchers/built_in/be_instance_of.rb +15 -0
- data/vendor_lib/rspec/matchers/built_in/be_kind_of.rb +11 -0
- data/vendor_lib/rspec/matchers/built_in/be_within.rb +55 -0
- data/vendor_lib/rspec/matchers/built_in/change.rb +141 -0
- data/vendor_lib/rspec/matchers/built_in/cover.rb +21 -0
- data/vendor_lib/rspec/matchers/built_in/eq.rb +22 -0
- data/vendor_lib/rspec/matchers/built_in/eql.rb +23 -0
- data/vendor_lib/rspec/matchers/built_in/equal.rb +48 -0
- data/vendor_lib/rspec/matchers/built_in/exist.rb +26 -0
- data/vendor_lib/rspec/matchers/built_in/has.rb +48 -0
- data/vendor_lib/rspec/matchers/built_in/include.rb +61 -0
- data/vendor_lib/rspec/matchers/built_in/match.rb +17 -0
- data/vendor_lib/rspec/matchers/built_in/match_array.rb +51 -0
- data/vendor_lib/rspec/matchers/built_in/raise_error.rb +154 -0
- data/vendor_lib/rspec/matchers/built_in/respond_to.rb +74 -0
- data/vendor_lib/rspec/matchers/built_in/satisfy.rb +30 -0
- data/vendor_lib/rspec/matchers/built_in/start_and_end_with.rb +48 -0
- data/vendor_lib/rspec/matchers/built_in/throw_symbol.rb +94 -0
- data/vendor_lib/rspec/matchers/built_in/yield.rb +297 -0
- data/vendor_lib/rspec/matchers/compatibility.rb +14 -0
- data/vendor_lib/rspec/matchers/configuration.rb +113 -0
- data/vendor_lib/rspec/matchers/dsl.rb +23 -0
- data/vendor_lib/rspec/matchers/generated_descriptions.rb +35 -0
- data/vendor_lib/rspec/matchers/matcher.rb +301 -0
- data/vendor_lib/rspec/matchers/method_missing.rb +12 -0
- data/vendor_lib/rspec/matchers/operator_matcher.rb +99 -0
- data/vendor_lib/rspec/matchers/pretty.rb +70 -0
- data/vendor_lib/rspec/matchers/test_unit_integration.rb +11 -0
- data/vendor_lib/rspec/mocks.rb +100 -0
- data/vendor_lib/rspec/mocks/any_instance/chain.rb +92 -0
- data/vendor_lib/rspec/mocks/any_instance/expectation_chain.rb +47 -0
- data/vendor_lib/rspec/mocks/any_instance/message_chains.rb +75 -0
- data/vendor_lib/rspec/mocks/any_instance/recorder.rb +200 -0
- data/vendor_lib/rspec/mocks/any_instance/stub_chain.rb +45 -0
- data/vendor_lib/rspec/mocks/any_instance/stub_chain_chain.rb +23 -0
- data/vendor_lib/rspec/mocks/argument_list_matcher.rb +104 -0
- data/vendor_lib/rspec/mocks/argument_matchers.rb +264 -0
- data/vendor_lib/rspec/mocks/arity_calculator.rb +66 -0
- data/vendor_lib/rspec/mocks/configuration.rb +111 -0
- data/vendor_lib/rspec/mocks/error_generator.rb +203 -0
- data/vendor_lib/rspec/mocks/errors.rb +12 -0
- data/vendor_lib/rspec/mocks/example_methods.rb +201 -0
- data/vendor_lib/rspec/mocks/extensions/marshal.rb +17 -0
- data/vendor_lib/rspec/mocks/framework.rb +36 -0
- data/vendor_lib/rspec/mocks/instance_method_stasher.rb +112 -0
- data/vendor_lib/rspec/mocks/matchers/have_received.rb +99 -0
- data/vendor_lib/rspec/mocks/matchers/receive.rb +112 -0
- data/vendor_lib/rspec/mocks/matchers/receive_messages.rb +72 -0
- data/vendor_lib/rspec/mocks/message_expectation.rb +643 -0
- data/vendor_lib/rspec/mocks/method_double.rb +209 -0
- data/vendor_lib/rspec/mocks/method_reference.rb +95 -0
- data/vendor_lib/rspec/mocks/mock.rb +7 -0
- data/vendor_lib/rspec/mocks/mutate_const.rb +406 -0
- data/vendor_lib/rspec/mocks/object_reference.rb +90 -0
- data/vendor_lib/rspec/mocks/order_group.rb +82 -0
- data/vendor_lib/rspec/mocks/proxy.rb +269 -0
- data/vendor_lib/rspec/mocks/proxy_for_nil.rb +37 -0
- data/vendor_lib/rspec/mocks/space.rb +95 -0
- data/vendor_lib/rspec/mocks/standalone.rb +3 -0
- data/vendor_lib/rspec/mocks/stub_chain.rb +51 -0
- data/vendor_lib/rspec/mocks/syntax.rb +374 -0
- data/vendor_lib/rspec/mocks/targets.rb +90 -0
- data/vendor_lib/rspec/mocks/test_double.rb +109 -0
- data/vendor_lib/rspec/mocks/verifying_double.rb +77 -0
- data/vendor_lib/rspec/mocks/verifying_message_expecation.rb +60 -0
- data/vendor_lib/rspec/mocks/verifying_proxy.rb +151 -0
- data/vendor_lib/rspec/mocks/version.rb +7 -0
- data/vendor_lib/rspec/support.rb +6 -0
- data/vendor_lib/rspec/support/caller_filter.rb +56 -0
- data/vendor_lib/rspec/support/spec.rb +14 -0
- data/vendor_lib/rspec/support/spec/deprecation_helpers.rb +29 -0
- data/vendor_lib/rspec/support/spec/in_sub_process.rb +40 -0
- data/vendor_lib/rspec/support/spec/stderr_splitter.rb +50 -0
- data/vendor_lib/rspec/support/version.rb +7 -0
- data/vendor_lib/rspec/support/warnings.rb +41 -0
- data/vendor_lib/rspec/version.rb +5 -0
- metadata +268 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
|
|
4
|
+
# @api private
|
|
5
|
+
class ObjectReference
|
|
6
|
+
# Returns an appropriate Object or Module reference based
|
|
7
|
+
# on the given argument.
|
|
8
|
+
def self.for(object_module_or_name, allow_direct_object_refs = false)
|
|
9
|
+
case object_module_or_name
|
|
10
|
+
when Module then DirectModuleReference.new(object_module_or_name)
|
|
11
|
+
when String then NamedObjectReference.new(object_module_or_name)
|
|
12
|
+
else
|
|
13
|
+
if allow_direct_object_refs
|
|
14
|
+
DirectObjectReference.new(object_module_or_name)
|
|
15
|
+
else
|
|
16
|
+
raise ArgumentError,
|
|
17
|
+
"Module or String expected, got #{object_module_or_name.inspect}"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Used when an object is passed to `object_double`.
|
|
24
|
+
# Represents a reference to that object.
|
|
25
|
+
# @api private
|
|
26
|
+
class DirectObjectReference
|
|
27
|
+
def initialize(object)
|
|
28
|
+
@object = object
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def description
|
|
32
|
+
@object.inspect
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def const_to_replace
|
|
36
|
+
raise ArgumentError,
|
|
37
|
+
"Can not perform constant replacement with an object."
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def defined?
|
|
41
|
+
true
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def when_loaded
|
|
45
|
+
yield @object
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Used when a module is passed to `class_double` or `instance_double`.
|
|
50
|
+
# Represents a reference to that module.
|
|
51
|
+
# @api private
|
|
52
|
+
class DirectModuleReference < DirectObjectReference
|
|
53
|
+
def const_to_replace
|
|
54
|
+
@object.name
|
|
55
|
+
end
|
|
56
|
+
alias description const_to_replace
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Used when a string is passed to `class_double`, `instance_double`
|
|
60
|
+
# or `object_double`.
|
|
61
|
+
# Represents a reference to the object named (via a constant lookup)
|
|
62
|
+
# by the string.
|
|
63
|
+
# @api private
|
|
64
|
+
class NamedObjectReference
|
|
65
|
+
def initialize(const_name)
|
|
66
|
+
@const_name = const_name
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def defined?
|
|
70
|
+
!!object
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def const_to_replace
|
|
74
|
+
@const_name
|
|
75
|
+
end
|
|
76
|
+
alias description const_to_replace
|
|
77
|
+
|
|
78
|
+
def when_loaded(&block)
|
|
79
|
+
yield object if object
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def object
|
|
85
|
+
@object ||= Constant.original(@const_name).original_value
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
# @private
|
|
4
|
+
class OrderGroup
|
|
5
|
+
def initialize
|
|
6
|
+
@expectations = []
|
|
7
|
+
@invocation_order = []
|
|
8
|
+
@index = 0
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @private
|
|
12
|
+
def register(expectation)
|
|
13
|
+
@expectations << expectation
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def invoked(message)
|
|
17
|
+
@invocation_order << message
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @private
|
|
21
|
+
def ready_for?(expectation)
|
|
22
|
+
remaining_expectations.find(&:ordered?) == expectation
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @private
|
|
26
|
+
def consume
|
|
27
|
+
remaining_expectations.each_with_index do |expectation, index|
|
|
28
|
+
if expectation.ordered?
|
|
29
|
+
@index += index + 1
|
|
30
|
+
return expectation
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
nil
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @private
|
|
37
|
+
def handle_order_constraint(expectation)
|
|
38
|
+
return unless expectation.ordered? && remaining_expectations.include?(expectation)
|
|
39
|
+
return consume if ready_for?(expectation)
|
|
40
|
+
expectation.raise_out_of_order_error
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def verify_invocation_order(expectation)
|
|
44
|
+
expectation.raise_out_of_order_error unless expectations_invoked_in_order?
|
|
45
|
+
true
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def clear
|
|
49
|
+
@index = 0
|
|
50
|
+
@invocation_order.clear
|
|
51
|
+
@expectations.clear
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def empty?
|
|
55
|
+
@expectations.empty?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def remaining_expectations
|
|
61
|
+
@expectations[@index..-1] || []
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def expectations_invoked_in_order?
|
|
65
|
+
invoked_expectations == expected_invocations
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def invoked_expectations
|
|
69
|
+
@expectations.select { |e| e.ordered? && @invocation_order.include?(e) }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def expected_invocations
|
|
73
|
+
@invocation_order.map { |invocation| expectation_for(invocation) }.compact
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def expectation_for(message)
|
|
77
|
+
@expectations.find { |e| message == e }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
# @private
|
|
4
|
+
class Proxy
|
|
5
|
+
SpecificMessage = Struct.new(:object,:message) do
|
|
6
|
+
def ==(expectation)
|
|
7
|
+
expectation.orig_object == object && expectation.message == message
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# @private
|
|
12
|
+
def initialize(object, order_group, name=nil, options={})
|
|
13
|
+
@object = object
|
|
14
|
+
@order_group = order_group
|
|
15
|
+
@name = name
|
|
16
|
+
@error_generator = ErrorGenerator.new(object, name)
|
|
17
|
+
@expectation_ordering = RSpec::Mocks::space.expectation_ordering
|
|
18
|
+
@messages_received = []
|
|
19
|
+
@options = options
|
|
20
|
+
@null_object = false
|
|
21
|
+
@method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @private
|
|
25
|
+
attr_reader :object
|
|
26
|
+
|
|
27
|
+
# @private
|
|
28
|
+
def null_object?
|
|
29
|
+
@null_object
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @private
|
|
33
|
+
# Tells the object to ignore any messages that aren't explicitly set as
|
|
34
|
+
# stubs or message expectations.
|
|
35
|
+
def as_null_object
|
|
36
|
+
@null_object = true
|
|
37
|
+
@object
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @private
|
|
41
|
+
def method_handle_for(message)
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @private
|
|
46
|
+
def add_message_expectation(location, method_name, opts={}, &block)
|
|
47
|
+
meth_double = method_double_for(method_name)
|
|
48
|
+
|
|
49
|
+
if null_object? && !block
|
|
50
|
+
meth_double.add_default_stub(@error_generator, @expectation_ordering, location, opts) do
|
|
51
|
+
@object
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
meth_double.add_expectation @error_generator, @expectation_ordering, location, opts, &block
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @private
|
|
59
|
+
def add_simple_expectation(method_name, response, location)
|
|
60
|
+
method_double_for(method_name).add_simple_expectation method_name, response, @error_generator, location
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @private
|
|
64
|
+
def build_expectation(method_name)
|
|
65
|
+
meth_double = method_double_for(method_name)
|
|
66
|
+
|
|
67
|
+
meth_double.build_expectation(
|
|
68
|
+
@error_generator,
|
|
69
|
+
@expectation_ordering
|
|
70
|
+
)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @private
|
|
74
|
+
def replay_received_message_on(expectation, &block)
|
|
75
|
+
expected_method_name = expectation.message
|
|
76
|
+
meth_double = method_double_for(expected_method_name)
|
|
77
|
+
|
|
78
|
+
if meth_double.expectations.any?
|
|
79
|
+
@error_generator.raise_expectation_on_mocked_method(expected_method_name)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
unless null_object? || meth_double.stubs.any?
|
|
83
|
+
@error_generator.raise_expectation_on_unstubbed_method(expected_method_name)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
@messages_received.each do |(actual_method_name, args, _)|
|
|
87
|
+
if expectation.matches?(actual_method_name, *args)
|
|
88
|
+
expectation.invoke(nil)
|
|
89
|
+
block.call(*args) if block
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @private
|
|
96
|
+
def check_for_unexpected_arguments(expectation)
|
|
97
|
+
@messages_received.each do |(method_name, args, _)|
|
|
98
|
+
if expectation.matches_name_but_not_args(method_name, *args)
|
|
99
|
+
raise_unexpected_message_args_error(expectation, *args)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# @private
|
|
105
|
+
def add_stub(location, method_name, opts={}, &implementation)
|
|
106
|
+
method_double_for(method_name).add_stub @error_generator, @expectation_ordering, location, opts, &implementation
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @private
|
|
110
|
+
def add_simple_stub(method_name, response)
|
|
111
|
+
method_double_for(method_name).add_simple_stub method_name, response
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# @private
|
|
115
|
+
def remove_stub(method_name)
|
|
116
|
+
method_double_for(method_name).remove_stub
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @private
|
|
120
|
+
def remove_single_stub(method_name, stub)
|
|
121
|
+
method_double_for(method_name).remove_single_stub(stub)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @private
|
|
125
|
+
def verify
|
|
126
|
+
@method_doubles.each_value {|d| d.verify}
|
|
127
|
+
ensure
|
|
128
|
+
reset
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# @private
|
|
132
|
+
def reset
|
|
133
|
+
@method_doubles.each_value {|d| d.reset}
|
|
134
|
+
@messages_received.clear
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# @private
|
|
138
|
+
def received_message?(method_name, *args, &block)
|
|
139
|
+
@messages_received.any? {|array| array == [method_name, args, block]}
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# @private
|
|
143
|
+
def has_negative_expectation?(message)
|
|
144
|
+
method_double_for(message).expectations.detect {|expectation| expectation.negative_expectation_for?(message)}
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# @private
|
|
148
|
+
def record_message_received(message, *args, &block)
|
|
149
|
+
@order_group.invoked SpecificMessage.new(object, message)
|
|
150
|
+
@messages_received << [message, args, block]
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# @private
|
|
154
|
+
def message_received(message, *args, &block)
|
|
155
|
+
record_message_received message, *args, &block
|
|
156
|
+
expectation = find_matching_expectation(message, *args)
|
|
157
|
+
stub = find_matching_method_stub(message, *args)
|
|
158
|
+
|
|
159
|
+
if (stub && expectation && expectation.called_max_times?) || (stub && !expectation)
|
|
160
|
+
expectation.increase_actual_received_count! if expectation && expectation.actual_received_count_matters?
|
|
161
|
+
if expectation = find_almost_matching_expectation(message, *args)
|
|
162
|
+
expectation.advise(*args) unless expectation.expected_messages_received?
|
|
163
|
+
end
|
|
164
|
+
stub.invoke(nil, *args, &block)
|
|
165
|
+
elsif expectation
|
|
166
|
+
expectation.invoke(stub, *args, &block)
|
|
167
|
+
elsif expectation = find_almost_matching_expectation(message, *args)
|
|
168
|
+
expectation.advise(*args) if null_object? unless expectation.expected_messages_received?
|
|
169
|
+
raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(message) or null_object?)
|
|
170
|
+
elsif stub = find_almost_matching_stub(message, *args)
|
|
171
|
+
stub.advise(*args)
|
|
172
|
+
raise_missing_default_stub_error(stub, *args)
|
|
173
|
+
elsif Class === @object
|
|
174
|
+
@object.superclass.__send__(message, *args, &block)
|
|
175
|
+
else
|
|
176
|
+
@object.__send__(:method_missing, message, *args, &block)
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# @private
|
|
181
|
+
def raise_unexpected_message_error(method_name, *args)
|
|
182
|
+
@error_generator.raise_unexpected_message_error method_name, *args
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# @private
|
|
186
|
+
def raise_unexpected_message_args_error(expectation, *args)
|
|
187
|
+
@error_generator.raise_unexpected_message_args_error(expectation, *args)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# @private
|
|
191
|
+
def raise_missing_default_stub_error(expectation, *args)
|
|
192
|
+
@error_generator.raise_missing_default_stub_error(expectation, *args)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
private
|
|
196
|
+
|
|
197
|
+
def method_double_for(message)
|
|
198
|
+
@method_doubles[message.to_sym]
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def find_matching_expectation(method_name, *args)
|
|
202
|
+
find_best_matching_expectation_for(method_name) do |expectation|
|
|
203
|
+
expectation.matches?(method_name, *args)
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def find_almost_matching_expectation(method_name, *args)
|
|
208
|
+
find_best_matching_expectation_for(method_name) do |expectation|
|
|
209
|
+
expectation.matches_name_but_not_args(method_name, *args)
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def find_best_matching_expectation_for(method_name)
|
|
214
|
+
first_match = nil
|
|
215
|
+
|
|
216
|
+
method_double_for(method_name).expectations.each do |expectation|
|
|
217
|
+
next unless yield expectation
|
|
218
|
+
return expectation unless expectation.called_max_times?
|
|
219
|
+
first_match ||= expectation
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
first_match
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def find_matching_method_stub(method_name, *args)
|
|
226
|
+
method_double_for(method_name).stubs.find {|stub| stub.matches?(method_name, *args)}
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def find_almost_matching_stub(method_name, *args)
|
|
230
|
+
method_double_for(method_name).stubs.find {|stub| stub.matches_name_but_not_args(method_name, *args)}
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
class PartialMockProxy < Proxy
|
|
235
|
+
def method_handle_for(message)
|
|
236
|
+
if any_instance_class_recorder_observing_method?(@object.class, message)
|
|
237
|
+
message = ::RSpec::Mocks.
|
|
238
|
+
any_instance_recorder_for(@object.class).
|
|
239
|
+
build_alias_method_name(message)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
::RSpec::Mocks.method_handle_for(@object, message)
|
|
243
|
+
rescue NameError
|
|
244
|
+
nil
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# @private
|
|
248
|
+
def add_simple_expectation(method_name, response, location)
|
|
249
|
+
method_double_for(method_name).configure_method
|
|
250
|
+
super
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# @private
|
|
254
|
+
def add_simple_stub(method_name, response)
|
|
255
|
+
method_double_for(method_name).configure_method
|
|
256
|
+
super
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
private
|
|
260
|
+
|
|
261
|
+
def any_instance_class_recorder_observing_method?(klass, method_name)
|
|
262
|
+
return true if ::RSpec::Mocks.any_instance_recorder_for(klass).already_observing?(method_name)
|
|
263
|
+
superklass = klass.superclass
|
|
264
|
+
return false if superklass.nil?
|
|
265
|
+
any_instance_class_recorder_observing_method?(superklass, method_name)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Mocks
|
|
3
|
+
# @private
|
|
4
|
+
class ProxyForNil < Proxy
|
|
5
|
+
|
|
6
|
+
def initialize(order_group)
|
|
7
|
+
@warn_about_expectations = true
|
|
8
|
+
super nil, order_group
|
|
9
|
+
end
|
|
10
|
+
attr_accessor :warn_about_expectations
|
|
11
|
+
alias warn_about_expectations? warn_about_expectations
|
|
12
|
+
|
|
13
|
+
def add_message_expectation(location, method_name, opts={}, &block)
|
|
14
|
+
warn(method_name) if warn_about_expectations?
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_negative_message_expectation(location, method_name, &implementation)
|
|
19
|
+
warn(method_name) if warn_about_expectations?
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def add_stub(location, method_name, opts={}, &implementation)
|
|
24
|
+
warn(method_name) if warn_about_expectations?
|
|
25
|
+
super
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
def warn method_name
|
|
31
|
+
source = CallerFilter.first_non_rspec_line
|
|
32
|
+
Kernel.warn("An expectation of :#{method_name} was set on nil. Called from #{source}. Use allow_message_expectations_on_nil to disable warnings.")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|