Techioz Blog

あるインスタンス メソッドが別のインスタンス メソッドのエイリアスであるかどうかをテストするエレガントな方法はありますか?

概要

単体テストでは、alias_method で定義されたエイリアス メソッドが適切に定義されているかどうかをテストする必要があります。元のエイリアスに使用されているのと同じテストを単純に使用することもできますが、より決定的または効率的な解決策があるかどうか疑問に思っています。たとえば、1) メソッドのエイリアスを逆参照して元の名前を返す、2) ある種の基礎となるメソッド識別子またはアドレスを取得して比較する、または 3) メソッド定義を取得して比較する方法はありますか?例えば:

class MyClass
  def foo
    # do something
  end

  alias_method :bar, :foo
end

describe MyClass do
  it "method bar should be an alias for method foo" do
    m = MyClass.new
    # ??? identity(m.bar).should == identity(m.foo) ???
  end
end

提案はありますか?

解決策

Method のドキュメントによると、

Object#method を呼び出して返される Method オブジェクトを比較すると、メソッドが同等であることが確認されます。

m.method(:bar) == m.method(:foo)