Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to test method alias ruby

How to test if if method has an alias?

Let's say we have

Class Test
  class << self
    def a;end
    alias :b :a
  end
end

so far I came up with idea to write this spec:

it { expect(Test.b).to receive(:a) }

but I believe there is better solution. Any ideas?

like image 866
Filip Bartuzi Avatar asked Sep 17 '14 06:09

Filip Bartuzi


3 Answers

You can use Object#method.

Test.method(:b) == Test.method(:a)
like image 120
oldergod Avatar answered Oct 12 '22 20:10

oldergod


You can use:

expect(obj.method(:method)).to eq(obj.method(:alias))
like image 45
Arnold Roa Avatar answered Oct 12 '22 20:10

Arnold Roa


oldergod's answer works in most scenarios:

Test.method(:b) == Test.method(:a)

Unfortunately it doesn't work in Ruby 2.3+ when the two methods have different owners (e.g. when the method is defined in a module, and the alias is defined in a class that includes the module). This is because the behavior of Method#== changed in Ruby 2.3:

If owners of methods are different, the behavior of super is different in the methods, so Method#== should not return true for the methods.

If you find yourself in this situation, where you want to test that two methods are aliases of each other but they have different owners, you can use Method#original_name or Method#source_location instead:

Test.method(:b).original_name == Test.method(:a).original_name
Test.method(:b).source_location == Test.method(:a).source_location
like image 32
Jeff Manian Avatar answered Oct 12 '22 18:10

Jeff Manian