48 lines
2.0 KiB
Diff
48 lines
2.0 KiB
Diff
|
|
From d0c032974234b4b124788cf57fe0f48d6f54a4a1 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Elliot Winkler <elliot.winkler@gmail.com>
|
||
|
|
Date: Mon, 24 Jul 2017 23:31:56 -0500
|
||
|
|
Subject: [PATCH] Doublespeak: Define #respond_to_missing? on ObjectDouble
|
||
|
|
|
||
|
|
The `delegate_method` matcher uses Doublespeak internally to do its job.
|
||
|
|
The delegate object is completely stubbed using an ObjectDouble,
|
||
|
|
available from Doublespeak, which is shoulda-matchers's own test double
|
||
|
|
library. ObjectDouble is a class that responds to every
|
||
|
|
method by implementing `method_missing`.
|
||
|
|
|
||
|
|
Say you are using Ruby 2.4 and you are testing a class that uses the
|
||
|
|
Forwardable module to do some delegation, and you are using
|
||
|
|
`delegate_method` in your test. When you run your test you will a
|
||
|
|
warning that looks something like:
|
||
|
|
|
||
|
|
Courier#deliver at ~/.rvm/rubies/ruby-2.4.0/lib/ruby/2.4.0/forwardable.rb:156 forwarding to private method #deliver
|
||
|
|
|
||
|
|
Why is this happening? When the code in your class gets exercised,
|
||
|
|
Forwardable will delegate the delegate method in question to
|
||
|
|
ObjectDouble, and the method will get intercepted by its
|
||
|
|
`method_missing` method. The fact that this is actually a private method
|
||
|
|
is what Forwardable is complaining about.
|
||
|
|
|
||
|
|
To fix this, all we need to do is add `respond_to_missing?` in addition
|
||
|
|
to `method_missing?`. This is explained here:
|
||
|
|
|
||
|
|
https://bugs.ruby-lang.org/issues/13326
|
||
|
|
---
|
||
|
|
lib/shoulda/matchers/doublespeak/object_double.rb | 4 ++++
|
||
|
|
1 file changed, 4 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/lib/shoulda/matchers/doublespeak/object_double.rb b/lib/shoulda/matchers/doublespeak/object_double.rb
|
||
|
|
index 823797b3..fe86a4a7 100644
|
||
|
|
--- a/lib/shoulda/matchers/doublespeak/object_double.rb
|
||
|
|
+++ b/lib/shoulda/matchers/doublespeak/object_double.rb
|
||
|
|
@@ -18,6 +18,10 @@ def respond_to?(name, include_private = nil)
|
||
|
|
true
|
||
|
|
end
|
||
|
|
|
||
|
|
+ def respond_to_missing?(name, include_all)
|
||
|
|
+ true
|
||
|
|
+ end
|
||
|
|
+
|
||
|
|
def method_missing(method_name, *args, &block)
|
||
|
|
call = MethodCall.new(
|
||
|
|
method_name: method_name,
|