-
-
Save txus/807456 to your computer and use it in GitHub Desktop.
# RSpec matcher to spec delegations. | |
# | |
# Usage: | |
# | |
# describe Post do | |
# it { should delegate(:name).to(:author).with_prefix } # post.author_name | |
# it { should delegate(:month).to(:created_at) } | |
# it { should delegate(:year).to(:created_at) } | |
# end | |
RSpec::Matchers.define :delegate do |method| | |
match do |delegator| | |
@method = @prefix ? :"#{@to}_#{method}" : method | |
@delegator = delegator | |
begin | |
@delegator.send(@to) | |
rescue NoMethodError | |
raise "#{@delegator} does not respond to #{@to}!" | |
end | |
@delegator.stub(@to).and_return double('receiver') | |
@delegator.send(@to).stub(method).and_return :called | |
@delegator.send(@method) == :called | |
end | |
description do | |
"delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}" | |
end | |
failure_message_for_should do |text| | |
"expected #{@delegator} to delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}" | |
end | |
failure_message_for_should_not do |text| | |
"expected #{@delegator} not to delegate :#{@method} to its #{@to}#{@prefix ? ' with prefix' : ''}" | |
end | |
chain(:to) { |receiver| @to = receiver } | |
chain(:with_prefix) { @prefix = true } | |
end |
This fails if the method is a setter with error:
Failure/Error: it{ should delegate(:name=).to(:sku_description)}
My fork has updated this gist to RSpec 3.3 version: https://gist.github.com/bparanj/4579700adca0b64e7ca0
Hahah! @txus ! Te veo hasta en la sopa :).
Hello,
Do you have a license that you would like to release this code under?
I spoke with Alec Winograd about his fork-of-Simeon's-fork (yep, 2 down), he's added an MIT License to his modifications.
I have also asked Simeon if he'd like to add a license to his modification, but it would be absolutely wonderful if you could assign a license to your code. [Edit] Simeon Simeonov has replied, and selected the MIT License for his modifications as well. [/Edit]
Thank you, hope all is well.
I'm using this for now but thanks for the original work 👏 ❤️
➡️ https://gist.github.com/purp/fe5f79e878b609560724d6b03242a5df
This is cool but there are three small problems with this implementation:
delegate :foo, to: :'@my_var'
@delegator.send(@to)
is an unexpected behavior from the standpoint of the user of the matcher. If there are any side effects from that call, the test outcome could be affected.All three issues are fixed in my fork: https://gist.github.com/ssimeonov/5942729