Sha256: 20739b3f462b0e8796364ac56030cf838232c3255199f8a43a5579fea8991634
Contents?: true
Size: 1.92 KB
Versions: 4
Compression:
Stored size: 1.92 KB
Contents
module Spec module Api class Mock # Remove all methods so they can be mocked too (public_instance_methods - ['__id__', '__send__', 'nil?']).each do |m| undef_method m end # Creates a new mock with a +name+ (that will be used in error messages only) # Options: # * <tt>:null_object</tt> - if true, the mock object acts as a forgiving null object allowing any message to be sent to it. def initialize(name, options={}) @name = name @options = DEFAULT_OPTIONS.dup.merge(options) @expectations = [] @expectation_ordering = OrderGroup.new end def should self end def receive(sym, &block) expected_from = caller(1)[0] expectation = MessageExpectation.new(@name, @expectation_ordering, expected_from, sym, block_given? ? block : nil) @expectations << expectation expectation end def __verify #:nodoc: @expectations.each do |expectation| expectation.verify_messages_received end end def method_missing(sym, *args, &block) if expectation = find_matching_expectation(sym, *args) expectation.invoke(args, block) else begin # act as null object if method is missing and we ignore them. return value too! @options[:null_object] ? self : super(sym, *args, &block) rescue NoMethodError arg_message = args.collect{|arg| "<#{arg}:#{arg.class.name}>"}.join(", ") Kernel::raise Spec::Api::MockExpectationError, "Mock '#{@name}' received unexpected message '#{sym}' with [#{arg_message}]" end end end private DEFAULT_OPTIONS = { :null_object => false } def find_matching_expectation(sym, *args) expectation = @expectations.find {|expectation| expectation.matches(sym, args)} end end end end
Version data entries
4 entries across 4 versions & 1 rubygems
Version | Path |
---|---|
rspec-0.5.16 | lib/spec/api/mocks/mock.rb |
rspec-0.5.15 | lib/spec/api/mocks/mock.rb |
rspec-0.5.13 | lib/spec/api/mocks/mock.rb |
rspec-0.5.14 | lib/spec/api/mocks/mock.rb |