lib/rspec-spies.rb in rspec-spies-2.1.3 vs lib/rspec-spies.rb in rspec-spies-2.1.4

- old
+ new

@@ -1,24 +1,19 @@ -require 'rspec/mocks/method_double' -RSpec::Mocks::MethodDouble.class_eval do - # override defining stubs to record the message was called. - # there's only one line difference from upstream rspec, but can't change it without fully overriding - def define_proxy_method - return if @method_is_proxied +require 'rspec/mocks/proxy' - object_singleton_class.class_eval <<-EOF, __FILE__, __LINE__ + 1 - def #{@method_name}(*args, &block) - __mock_proxy.record_message_received :#{@method_name}, *args, &block - __mock_proxy.message_received :#{@method_name}, *args, &block - end - #{visibility_for_method} - EOF - @method_is_proxied = true +RSpec::Mocks::Proxy.class_eval do + alias_method :oldsp_message_received, :message_received + alias_method :oldsp_reset, :reset + + def message_received(message, *args, &block) + record_message_received(message, *args, &block) + oldsp_message_received(message, *args, &block) end - def visibility_for_method - "#{visibility} :#{method_name}" + def reset + @messages_received = [] + oldsp_reset end end require 'rspec/expectations' require 'rspec/matchers' @@ -31,25 +26,38 @@ RSpec::Mocks::ArgumentExpectation end RSpec::Matchers.define :have_received do |method_name, args, block| match do |actual| - messages_received = actual.send(:__mock_proxy).instance_variable_get("@messages_received") - messages_received.any? do |message| + @messages_received = actual.send(:__mock_proxy).instance_variable_get("@messages_received").dup + @messages_received.keep_if do |message| received_method_name, received_args, received_block = *message result = (received_method_name == method_name) - result &&= argument_expectation_class.new(@args || any_args).args_match?(received_args) - result &&= (received_block == block) + result &&= argument_expectation_class.new(*@args || any_args).args_match?(*received_args) end + + if @times + @messages_received.length == @expected_count + else + @messages_received.length > 0 + end end chain :with do |*args| @args = args end + chain :exactly do |count| + @expected_count = count + end + + chain :times do + @times = true + end + failure_message_for_should do |actual| - "expected #{actual.inspect} to have received #{method_name.inspect}#{args_message}" + "expected #{actual.inspect} to have received #{method_name.inspect}#{args_message}#{times_message}" end failure_message_for_should_not do |actual| "expected #{actual.inspect} to not have received #{method_name.inspect}#{args_message}, but did" end @@ -58,7 +66,11 @@ "to have received #{method_name.inspect}#{args_message}" end def args_message @args ? " with #{@args.inspect}" : "" + end + + def times_message + @times ? " exactly #{@expected_count} times but was called #{@messages_received.count} times" : "" end end