class RSpec::Matchers::BuiltIn::YieldProbe
@private Object
that is yielded to ‘expect` when one of the yield matchers is used. Provides information about the yield behavior of the object-under-test.
Attributes
Public Class Methods
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 21 def initialize(block, &callback) @block = block @callback = callback || Proc.new {} @used = false self.num_yields = 0 self.yielded_args = [] end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 13 def self.probe(block, &callback) probe = new(block, &callback) return probe unless probe.has_block? probe.probe end
Public Instance Methods
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 68 def assert_used! return if @used raise 'You must pass the argument yielded to your expect block on ' \ 'to the method-under-test as a block. It acts as a probe that ' \ 'allows the matcher to detect whether or not the method-under-test ' \ 'yields, and, if so, how many times, and what the yielded arguments ' \ 'are.' end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 78 def assert_valid_expect_block! block_signature = RSpec::Support::BlockSignature.new(@block) return if RSpec::Support::StrictSignatureVerifier.new(block_signature, [self]).valid? raise 'Your expect block must accept an argument to be used with this ' \ 'matcher. Pass the argument as a block on to the method you are testing.' end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 29 def has_block? Proc === @block end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 33 def probe assert_valid_expect_block! @block.call(self) assert_used! self end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 53 def single_yield_args yielded_args.first end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 40 def to_proc @used = true probe = self callback = @callback Proc.new do |*args| probe.num_yields += 1 probe.yielded_args << args callback.call(*args) nil # to indicate the block does not return a meaningful value end end
# File rspec-expectations/lib/rspec/matchers/built_in/yield.rb, line 57 def yielded_once?(matcher_name) case num_yields when 1 then true when 0 then false else raise "The #{matcher_name} matcher is not designed to be used with a " \ 'method that yields multiple times. Use the yield_successive_args ' \ 'matcher for that case.' end end