Class: FlexMock
- Extended by:
- ArgumentTypes
- Includes:
- Ordering
- Defined in:
- lib/flexmock/core.rb,
lib/flexmock/rspec.rb,
lib/flexmock/errors.rb,
lib/flexmock/version.rb,
lib/flexmock/ordering.rb,
lib/flexmock/recorder.rb,
lib/flexmock/undefined.rb,
lib/flexmock/validators.rb,
lib/flexmock/call_record.rb,
lib/flexmock/expectation.rb,
lib/flexmock/mock_builder.rb,
lib/flexmock/partial_mock.rb,
lib/flexmock/argument_types.rb,
lib/flexmock/call_validator.rb,
lib/flexmock/mock_container.rb,
lib/flexmock/spy_describers.rb,
lib/flexmock/explicit_needed.rb,
lib/flexmock/argument_matchers.rb,
lib/flexmock/argument_matching.rb,
lib/flexmock/rspec_spy_matcher.rb,
lib/flexmock/core_class_methods.rb,
lib/flexmock/deprecated_methods.rb,
lib/flexmock/expectation_builder.rb,
lib/flexmock/expectation_director.rb,
lib/flexmock/expectation_recorder.rb,
lib/flexmock/composite_expectation.rb,
lib/flexmock/test_unit_integration.rb,
lib/flexmock/default_framework_adapter.rb,
lib/flexmock/test_unit_assert_spy_called.rb,
lib/flexmock/test_unit_testcase_extensions.rb,
lib/flexmock/extensions/active_record_model.rb
Overview
Permission is granted for use, copying, modification, distribution, and distribution of modified versions of this work as long as the above copyright notice is included. +++
Defined Under Namespace
Modules: ArgumentMatching, ArgumentTypes, Extensions, GenericTestCase, MockContainer, Ordering, RSpecMatchers, SpyDescribers, TestCase, TestUnitAssertions, Version Classes: AnyMatcher, AtLeastCountValidator, AtMostCountValidator, CallRecord, CallValidator, CompositeExpectation, CountValidator, DefaultFrameworkAdapter, DuckMatcher, EqualMatcher, ExactCountValidator, Expectation, ExpectationBuilder, ExpectationDirector, ExpectationRecorder, ExplicitNeeded, ExtensionRegistry, HashMatcher, MockBuilder, MockError, OptionalProcMatcher, PartialMockProxy, ProcMatcher, RSpecFrameworkAdapter, Recorder, TestUnitFrameworkAdapter, Undefined, UsageError, UseContainer
Constant Summary collapse
- CALL_VALIDATOR =
CallValidator.new
- SpecModule =
Spec
- VERSION =
Version::NUMBERS.join('.')
- CONTAINER_HELPER =
ExtensionRegistry.new
- ANY =
AnyMatcher.new
- OPTIONAL_PROC_MATCHER =
OptionalProcMatcher.new
- EXP_BUILDER =
ExpectationBuilder.new
Class Attribute Summary collapse
-
.framework_adapter ⇒ Object
readonly
Returns the value of attribute framework_adapter.
-
.partials_are_based ⇒ Object
Returns the value of attribute partials_are_based.
Instance Attribute Summary collapse
-
#flexmock_container ⇒ Object
Returns the value of attribute flexmock_container.
-
#flexmock_name ⇒ Object
readonly
Returns the value of attribute flexmock_name.
Class Method Summary collapse
-
.check(msg, &block) ⇒ Object
Check will assert the block returns true.
-
.format_args(args) ⇒ Object
Class method to format a list of args (the part between the parenthesis).
-
.format_call(sym, args) ⇒ Object
Class method to format a method name and argument list as a nice looking string.
-
.undefined ⇒ Object
Undefined is normally available as FlexMock.undefined.
-
.use(*names) ⇒ Object
Class method to make sure that verify is called at the end of a test.
Instance Method Summary collapse
- #by_default ⇒ Object
- #flexmock_based_on(base_class) ⇒ Object
-
#flexmock_calls ⇒ Object
Return the list of calls made on this mock.
-
#flexmock_define_expectation(location, *args) ⇒ Object
Using
location
, define the expectations specified byargs
. -
#flexmock_expectations_for(method_name) ⇒ Object
Return the expectation director for a method name.
-
#flexmock_find_expectation(method_name, *args) ⇒ Object
Find the mock expectation for method sym and arguments.
-
#flexmock_invoke_original(method_name, args) ⇒ Object
Invocke the original non-mocked functionality for the given symbol.
-
#flexmock_received?(method_name, args, options = {}) ⇒ Boolean
True if the mock received the given method and arguments.
-
#flexmock_respond_to? ⇒ Object
Save the original definition of respond_to? for use a bit later.
-
#flexmock_teardown ⇒ Object
Teardown and infrastructure setup for this mock.
-
#flexmock_verify ⇒ Object
Verify that each method that had an explicit expected count was actually called that many times.
-
#initialize(name = "unknown", container = nil) ⇒ FlexMock
constructor
Create a FlexMock object with the given name.
-
#inspect ⇒ Object
Return the inspection string for a mock.
-
#method(method_name) ⇒ Object
Override the built-in
method
to include the mocked methods. -
#method_missing(sym, *args, &block) ⇒ Object
Handle missing methods by attempting to look up a handler.
-
#mock_handle(sym, expected_count = nil, &block) ⇒ Object
Handle all messages denoted by
sym
by calling the given block and passing any parameters to the block. -
#respond_to?(sym, *args) ⇒ Boolean
Override the built-in respond_to? to include the mocked methods.
-
#should_expect {|Recorder.new(self)| ... } ⇒ Object
Declare that the mock object should expect methods by providing a recorder for the methods and having the user invoke the expected methods in a block.
-
#should_ignore_missing ⇒ Object
(also: #mock_ignore_missing)
Ignore all undefined (missing) method calls.
-
#should_receive(*args) ⇒ Object
:call-seq: mock.should_receive(:method_name) mock.should_receive(:method1, method2, …) mock.should_receive(:meth1 => result1, :meth2 => result2, …).
Methods included from ArgumentTypes
any, ducktype, eq, hsh, on, optional_proc
Methods included from Ordering
#flexmock_allocate_order, #flexmock_current_order, #flexmock_current_order=, #flexmock_groups, #flexmock_validate_order
Constructor Details
#initialize(name = "unknown", container = nil) ⇒ FlexMock
Create a FlexMock object with the given name. The name is used in error messages. If no container is given, create a new, one-off container for this mock.
58 59 60 61 62 63 64 65 66 67 |
# File 'lib/flexmock/core.rb', line 58 def initialize(name="unknown", container=nil) @flexmock_name = name @expectations = Hash.new @ignore_missing = false @verified = false @calls = [] @base_class = nil container = UseContainer.new if container.nil? container.flexmock_remember(self) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(sym, *args, &block) ⇒ Object
Handle missing methods by attempting to look up a handler.
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/flexmock/core.rb', line 103 def method_missing(sym, *args, &block) enhanced_args = block_given? ? args + [block] : args call_record = CallRecord.new(sym, enhanced_args, block_given?) @calls << call_record flexmock_wrap do if handler = @expectations[sym] handler.call(enhanced_args, call_record) elsif @base_class && @base_class.flexmock_defined?(sym) FlexMock.undefined elsif @ignore_missing FlexMock.undefined else super(sym, *args, &block) end end end |
Class Attribute Details
.framework_adapter ⇒ Object (readonly)
Returns the value of attribute framework_adapter.
17 18 19 |
# File 'lib/flexmock/core_class_methods.rb', line 17 def framework_adapter @framework_adapter end |
.partials_are_based ⇒ Object
Returns the value of attribute partials_are_based.
51 52 53 |
# File 'lib/flexmock/core.rb', line 51 def partials_are_based @partials_are_based end |
Instance Attribute Details
#flexmock_container ⇒ Object
Returns the value of attribute flexmock_container.
48 49 50 |
# File 'lib/flexmock/core.rb', line 48 def flexmock_container @flexmock_container end |
#flexmock_name ⇒ Object (readonly)
Returns the value of attribute flexmock_name.
47 48 49 |
# File 'lib/flexmock/core.rb', line 47 def flexmock_name @flexmock_name end |
Class Method Details
.check(msg, &block) ⇒ Object
Check will assert the block returns true. If it doesn’t, an assertion failure is triggered with the given message.
69 70 71 |
# File 'lib/flexmock/core_class_methods.rb', line 69 def check(msg, &block) # :nodoc: FlexMock.framework_adapter.make_assertion(msg, &block) end |
.format_args(args) ⇒ Object
Class method to format a list of args (the part between the parenthesis).
59 60 61 62 63 64 65 |
# File 'lib/flexmock/core_class_methods.rb', line 59 def format_args(args) if args args.collect { |a| a.inspect }.join(', ') else "*args" end end |
.format_call(sym, args) ⇒ Object
Class method to format a method name and argument list as a nice looking string.
53 54 55 |
# File 'lib/flexmock/core_class_methods.rb', line 53 def format_call(sym, args) # :nodoc: "#{sym}(#{format_args(args)})" end |
.undefined ⇒ Object
Undefined is normally available as FlexMock.undefined
47 48 49 |
# File 'lib/flexmock/undefined.rb', line 47 def self.undefined @undefined end |
.use(*names) ⇒ Object
Class method to make sure that verify is called at the end of a test. One mock object will be created for each name given to the use method. The mocks will be passed to the block as arguments. If no names are given, then a single anonymous mock object will be created.
At the end of the use block, each mock object will be verified to make sure the proper number of calls have been made.
Usage:
FlexMock.use("name") do |mock| # Creates a mock named "name"
mock.should_receive(:meth).
returns(0).once
end # mock is verified here
NOTE: If you include FlexMock::TestCase into your test case file, you can create mocks that will be automatically verified in the test teardown by using the flexmock
method.
39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/flexmock/core_class_methods.rb', line 39 def use(*names) names = ["unknown"] if names.empty? container = UseContainer.new mocks = names.collect { |n| container.flexmock(n) } yield(*mocks) rescue Exception => _ container.got_exception = true raise ensure container.flexmock_teardown end |
Instance Method Details
#by_default ⇒ Object
97 98 99 100 |
# File 'lib/flexmock/core.rb', line 97 def by_default @last_expectation.by_default self end |
#flexmock_based_on(base_class) ⇒ Object
139 140 141 142 |
# File 'lib/flexmock/core.rb', line 139 def flexmock_based_on(base_class) @base_class = base_class should_receive(:class => base_class) end |
#flexmock_calls ⇒ Object
Return the list of calls made on this mock. Used in formatting error messages.
153 154 155 |
# File 'lib/flexmock/core.rb', line 153 def flexmock_calls @calls end |
#flexmock_define_expectation(location, *args) ⇒ Object
Using location
, define the expectations specified by args
.
199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/flexmock/core.rb', line 199 def flexmock_define_expectation(location, *args) @last_expectation = EXP_BUILDER.parse_should_args(self, args) do |method_name| @expectations[method_name] ||= ExpectationDirector.new(method_name) result = Expectation.new(self, method_name, location) @expectations[method_name] << result override_existing_method(method_name) if flexmock_respond_to?(method_name) result = ExplicitNeeded.new(result, method_name, @base_class) if @base_class && ! @base_class.flexmock_defined?(method_name) result end end |
#flexmock_expectations_for(method_name) ⇒ Object
Return the expectation director for a method name.
135 136 137 |
# File 'lib/flexmock/core.rb', line 135 def flexmock_expectations_for(method_name) # :nodoc: @expectations[method_name] end |
#flexmock_find_expectation(method_name, *args) ⇒ Object
Find the mock expectation for method sym and arguments.
129 130 131 132 |
# File 'lib/flexmock/core.rb', line 129 def flexmock_find_expectation(method_name, *args) # :nodoc: exp = @expectations[method_name] exp ? exp.find_expectation(*args) : nil end |
#flexmock_invoke_original(method_name, args) ⇒ Object
Invocke the original non-mocked functionality for the given symbol.
159 160 161 |
# File 'lib/flexmock/core.rb', line 159 def flexmock_invoke_original(method_name, args) return FlexMock.undefined end |
#flexmock_received?(method_name, args, options = {}) ⇒ Boolean
True if the mock received the given method and arguments.
147 148 149 |
# File 'lib/flexmock/core.rb', line 147 def flexmock_received?(method_name, args, ={}) CALL_VALIDATOR.received?(@calls, method_name, args, ) end |
#flexmock_respond_to? ⇒ Object
Save the original definition of respond_to? for use a bit later.
121 |
# File 'lib/flexmock/core.rb', line 121 alias flexmock_respond_to? respond_to? |
#flexmock_teardown ⇒ Object
Teardown and infrastructure setup for this mock.
87 88 |
# File 'lib/flexmock/core.rb', line 87 def flexmock_teardown end |
#flexmock_verify ⇒ Object
Verify that each method that had an explicit expected count was actually called that many times.
76 77 78 79 80 81 82 83 84 |
# File 'lib/flexmock/core.rb', line 76 def flexmock_verify return if @verified @verified = true flexmock_wrap do @expectations.each do |sym, handler| handler.flexmock_verify end end end |
#inspect ⇒ Object
Return the inspection string for a mock.
70 71 72 |
# File 'lib/flexmock/core.rb', line 70 def inspect "<FlexMock:#{flexmock_name}>" end |
#method(method_name) ⇒ Object
Override the built-in method
to include the mocked methods.
164 165 166 167 168 169 170 171 172 |
# File 'lib/flexmock/core.rb', line 164 def method(method_name) @expectations[method_name] || super rescue NameError => ex if @ignore_missing proc { FlexMock.undefined } else raise ex end end |
#mock_handle(sym, expected_count = nil, &block) ⇒ Object
Handle all messages denoted by sym
by calling the given block and passing any parameters to the block. If we know exactly how many calls are to be made to a particular method, we may check that by passing in the number of expected calls as a second paramter.
40 41 42 43 44 |
# File 'lib/flexmock/deprecated_methods.rb', line 40 def mock_handle(sym, expected_count=nil, &block) # :nodoc: $stderr.puts "mock_handle is deprecated, " + "use the new should_receive interface instead." self.should_receive(sym).times(expected_count).returns(&block) end |
#respond_to?(sym, *args) ⇒ Boolean
Override the built-in respond_to? to include the mocked methods.
124 125 126 |
# File 'lib/flexmock/core.rb', line 124 def respond_to?(sym, *args) super || (@expectations[sym] ? true : @ignore_missing) end |
#should_expect {|Recorder.new(self)| ... } ⇒ Object
Declare that the mock object should expect methods by providing a recorder for the methods and having the user invoke the expected methods in a block. Further expectations may be applied the result of the recording call.
Example Usage:
mock.should_expect do |record|
record.add(Integer, 4) { |a, b|
a + b
}.at_least.once
223 224 225 |
# File 'lib/flexmock/core.rb', line 223 def should_expect yield Recorder.new(self) end |
#should_ignore_missing ⇒ Object Also known as: mock_ignore_missing
Ignore all undefined (missing) method calls.
91 92 93 94 |
# File 'lib/flexmock/core.rb', line 91 def should_ignore_missing @ignore_missing = true self end |
#should_receive(*args) ⇒ Object
:call-seq:
mock.should_receive(:method_name)
mock.should_receive(:method1, method2, ...)
mock.should_receive(:meth1 => result1, :meth2 => result2, ...)
Declare that the mock object should receive a message with the given name.
If more than one method name is given, then the mock object should expect to receive all the listed melthods. If a hash of method name/value pairs is given, then the each method will return the associated result. Any expectations applied to the result of should_receive
will be applied to all the methods defined in the argument list.
An expectation object for the method name is returned as the result of this method. Further expectation constraints can be added by chaining to the result.
See Expectation for a list of declarators that can be used.
193 194 195 196 |
# File 'lib/flexmock/core.rb', line 193 def should_receive(*args) location = caller.first flexmock_define_expectation(location, *args) end |