Class: ConvenientService::RSpec::PrimitiveMatchers::Classes::CacheItsValue

Inherits:
Object
  • Object
show all
Defined in:
lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb

Instance Method Summary collapse

Instance Method Details

#descriptionObject



41
42
43
# File 'lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb', line 41

def description
  "cache its value"
end

#failure_messageObject



45
46
47
# File 'lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb', line 45

def failure_message
  "expected #{printable_block_expectation} to cache its value"
end

#failure_message_when_negatedObject



49
50
51
# File 'lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb', line 49

def failure_message_when_negated
  "expected #{printable_block_expectation} NOT to cache its value"
end

#matches?(block_expectation) ⇒ Boolean

Note:

cache_its_value may lead to false positives.

Note:

cache_its_value calls the expect block twice to check its return values object ids.

Examples:

False positive spec.


let(:command_result) { command.call }

specify do
  # bad - `command_result` is already cached(memoized) by `let`. That is why `cache_its_value` is always satisfied.
  expect { command_result }.to cache_its_value
end

Correct spec.


specify do
  # good - `command.call` is recalculated every time `expect` block is invoked.
  expect { command.call }.to cache_its_value
end

Returns:

  • (Boolean)


28
29
30
31
32
33
34
35
# File 'lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb', line 28

def matches?(block_expectation)
  @block_expectation = block_expectation

  ##
  # NOTE: Identical to `block_expectation.call.object_id == block_expectation.call.object_id`.
  #
  block_expectation.call.equal?(block_expectation.call)
end

#printable_block_expectationObject

NOTE: An example of how RSpec extracts block source, but they marked it as private. https://github.com/rspec/rspec-expectations/blob/311aaf245f2c5493572bf683b8c441cb5f7e44c8/lib/rspec/matchers/built_in/change.rb#L437

TODO: printable_block_expectation when method_source is available. https://github.com/banister/method_source

def printable_block_expectation @printable_block_expectation ||= block_expectation.source end



64
65
66
# File 'lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb', line 64

def printable_block_expectation
  @printable_block_expectation ||= "{ ... }"
end

#supports_block_expectations?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'lib/convenient_service/rspec/primitive_matchers/classes/cache_its_value.rb', line 37

def supports_block_expectations?
  true
end