Class: Tiramisu::Expectation

Inherits:
Object
  • Object
show all
Defined in:
lib/tiramisu/expectations.rb,
lib/tiramisu/expectations/with.rb,
lib/tiramisu/expectations/raise.rb,
lib/tiramisu/expectations/throw.rb,
lib/tiramisu/expectations/return.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object, expected_message, assert, caller) ⇒ Expectation

Returns a new instance of Expectation.



17
18
19
20
21
22
23
# File 'lib/tiramisu/expectations.rb', line 17

def initialize object, expected_message, assert, caller
  @object = object
  @expected_message = expected_message.to_sym
  @assert = assert
  @caller = caller
  proxify(@object, @expected_message)
end

Instance Attribute Details

#expected_messageObject (readonly)

Returns the value of attribute expected_message.



15
16
17
# File 'lib/tiramisu/expectations.rb', line 15

def expected_message
  @expected_message
end

#received_messagesObject (readonly)

Returns the value of attribute received_messages.



15
16
17
# File 'lib/tiramisu/expectations.rb', line 15

def received_messages
  @received_messages
end

Class Method Details

.restore_object_status(obj) ⇒ Object



4
5
6
7
8
9
10
11
12
13
# File 'lib/tiramisu/expectations.rb', line 4

def self.restore_object_status obj
  return unless obj.instance_variable_get(:@__tiramisu__original_methods__)

  obj.instance_variable_get(:@__tiramisu__original_methods__).each_pair do |n,m|
    obj.define_singleton_method(n, &m)
  end

  obj.instance_variable_set(:@__tiramisu__original_methods__, {})
  obj.instance_variable_set(:@__tiramisu__received_messages__, {})
end

Instance Method Details

#and_raise(type = nil, message = nil, &block) ⇒ Object

Note:

if block given it will have precedence over arguments

ensure received message raises as expected

Examples:

x = mock(X.new)
expect(x).to_receive(:y).and_raise(NoMethodError)
# call `x.y` for test to pass


13
14
15
# File 'lib/tiramisu/expectations/raise.rb', line 13

def and_raise type = nil, message = nil, &block
  @raise = block || [type, message]
end

#and_return(value = nil, &block) ⇒ Object

Note:

if block given it will have precedence over arguments

ensure received message returns expected value

Examples:

n = mock(1)
expect(n).to_receive(:+).with(1).and_return(2)


12
13
14
# File 'lib/tiramisu/expectations/return.rb', line 12

def and_return value = nil, &block
  @return = block || value
end

#and_throw(symbol = nil, &block) ⇒ Object

Note:

if block given it will have precedence over arguments

ensure received message throws as expected

Examples:

x = mock(X.new)
expect(x).to_receive(:y).and_throw(:z)


12
13
14
# File 'lib/tiramisu/expectations/throw.rb', line 12

def and_throw symbol = nil, &block
  @throw = [symbol, block]
end

#assert_message_raised_as_expectedObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/tiramisu/expectations/raise.rb', line 17

def assert_message_raised_as_expected
  return unless @raise
  if @raise.is_a?(Proc)
    received_messages.find {|log| @raise.call(log[:raised])} || Tiramisu.fail([
      'Looks like :%s message never raised as expected' % expected_message,
      'See validation block'
    ], @caller)
  else
    received_messages.each do |log|
      next unless f = Tiramisu.assert_raised_as_expected(log, *@raise)
      Tiramisu.fail(f, log[:caller])
    end
  end
end

#assert_message_thrown_as_expectedObject



16
17
18
19
20
21
22
# File 'lib/tiramisu/expectations/throw.rb', line 16

def assert_message_thrown_as_expected
  return unless @throw
  received_messages.each do |log|
    next unless f = Tiramisu.assert_thrown_as_expected(log, *@throw)
    Tiramisu.fail(f, log[:caller])
  end
end

#validateObject



25
26
27
28
29
30
31
32
33
# File 'lib/tiramisu/expectations.rb', line 25

def validate
  @received_messages = @object.__tiramisu__received_messages__[expected_message] || []
  return refute_message_received unless @assert
  assert_message_received
  assert_message_received_with_correct_arguments
  assert_message_returned_correct_value
  assert_message_raised_as_expected
  assert_message_thrown_as_expected
end

#with(*args, &block) ⇒ Object

Note:

if block given it will have precedence over arguments

ensure expected message received with correct arguments

Examples:

test :some_test do
  some_object = mock(SomeObject.new)
  expect(some_object).to_receive(:some_method).with(:some, :args)
  # call `some_object.some_method(:some, :args)` for test to pass
end


15
16
17
18
# File 'lib/tiramisu/expectations/with.rb', line 15

def with *args, &block
  @with = block || args
  self
end