Module: FlexMock::MockContainer

Included in:
TestCase, Test::Unit::TestCase
Defined in:
lib/flexmock/mock_container.rb

Overview

Mock container methods

Include this module in to get integration with FlexMock. When this module is included, mocks may be created with a simple call to the flexmock method. Mocks created with via the method call will automatically be verified in the teardown of the test case.

Instance Method Summary collapse

Instance Method Details

#flexmock(*args) {|mock| ... } ⇒ Object Also known as: flexstub

Create a mocking object in the FlexMock framework. The flexmock method has a number of options available, depending on just what kind of mocking object your require. Mocks created via flexmock will be automatically verify during the teardown phase of your test framework.

:call-seq:

flexmock() { |mock| ... }
flexmock(name) { |mock| ... }
flexmock(expect_hash) { |mock| ... }
flexmock(name, expect_hash) { |mock| ... }
flexmock(real_object) { |mock| ... }
flexmock(real_object, name) { |mock| ... }
flexmock(real_object, name, expect_hash) { |mock| ... }
flexmock(:base, string, name, expect_hash) { |mock| ... }
name

Name of the mock object. If no name is given, “unknown” is used for full mocks and “flexmock(real_object)” is used for partial mocks.

expect_hash

Hash table of method names and values. Each method/value pair is used to setup a simple expectation so that if the mock object receives a message matching an entry in the table, it returns the associated value. No argument our call count constraints are added. Using an expect_hash is identical to calling:

mock.should_receive(method_name).and_return(value)

for each of the method/value pairs in the hash.

real_object

If a real object is given, then a partial mock is constructed using the real_object as a base. Partial mocks (formally referred to as stubs) behave as a mock object when an expectation is matched, and otherwise will behave like the original object. This is useful when you want to use a real object for testing, but need to mock out just one or two methods.

:base

Forces the following argument to be used as the base of a partial mock object. This explicit tag is only needed if you want to use a string or a symbol as the mock base (string and symbols would normally be interpretted as the mock name).

&block

If a block is given, then the mock object is passed to the block and expectations may be configured within the block.

Yields:

  • (mock)


101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/flexmock/mock_container.rb', line 101

def flexmock(*args)
  name = nil
  quick_defs = {}
  stub_target = nil
  while ! args.empty?
    case args.first
    when :base
      args.shift
      stub_target = args.shift
    when String, Symbol
      name = args.shift.to_s
    when Hash
      quick_defs = args.shift
    else
      stub_target = args.shift
    end
  end
  if stub_target
    mock = flexmock_make_stub(stub_target, name)
  else
    mock = FlexMock.new(name || "unknown")
  end
  flexmock_quick_define(mock, quick_defs)
  yield(mock) if block_given?
  flexmock_remember(mock)
  mock
end

#flexmock_closeObject

Close all the mock objects in the container. Closing a mock object restores any original behavior that was displaced by the mock.



43
44
45
46
47
48
49
# File 'lib/flexmock/mock_container.rb', line 43

def flexmock_close
  @flexmock_created_mocks ||= []
  @flexmock_created_mocks.each do |m|
    m.mock_teardown
  end
  @flexmock_created_mocks = []
end

#flexmock_teardownObject

Do the flexmock specific teardown stuff. If you need finer control, you can use either flexmock_verify or flexmock_close.



27
28
29
30
31
# File 'lib/flexmock/mock_container.rb', line 27

def flexmock_teardown
  flexmock_verify if passed?
ensure
  flexmock_close
end

#flexmock_verifyObject

Perform verification on all mocks in the container.



34
35
36
37
38
39
# File 'lib/flexmock/mock_container.rb', line 34

def flexmock_verify
  @flexmock_created_mocks ||= []
  @flexmock_created_mocks.each do |m|
    m.mock_verify
  end
end