-
-
Notifications
You must be signed in to change notification settings - Fork 909
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Doublespeak: Define #respond_to_missing? on ObjectDouble #1038
Doublespeak: Define #respond_to_missing? on ObjectDouble #1038
Conversation
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
@@ -18,6 +18,10 @@ def respond_to?(name, include_private = nil) | |||
true | |||
end | |||
|
|||
def respond_to_missing?(name, include_all) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused method argument - name. If it's necessary, use _ or _name as an argument name to indicate that it won't be used. You can also write as respond_to_missing?() if you want the method to accept any arguments but don't care about them.
Unused method argument - include_all. If it's necessary, use _ or _include_all as an argument name to indicate that it won't be used. You can also write as respond_to_missing?() if you want the method to accept any arguments but don't care about them.
Oh whoops! Looks like you saw it, never mind :) |
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 awarning that looks something like:
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 methodis what Forwardable is complaining about.
To fix this, all we need to do is add
respond_to_missing?
in additionto
method_missing?
. This is explained here:https://bugs.ruby-lang.org/issues/13326
This fixes #1006.