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