是否有一种优雅的方法来测试一个实例方法是否是另一个实例的别名?

Mor*_*ori 11 ruby reflection alias-method

在单元测试中,我需要测试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
Run Code Online (Sandbox Code Playgroud)

建议?

bk1*_*k1e 18

根据Method的文档,

如果两个方法对象绑定到同一个对象并包含相同的主体,则它们是相等的.

调用Object#method和比较Method它返回的对象将验证方法是否等效:

m.method(:bar) == m.method(:foo)
Run Code Online (Sandbox Code Playgroud)

  • 而且,通常,仅具有相同主体但不相互复制的方法强调*不相等.证明:`Class.new {def foo()结束; def bar()结束; puts instance_method(:foo)== instance_method(:bar)}` (2认同)
  • 此外,"从别名方法返回true"来自http://github.com/rubyspec/rubyspec/blob/master/core/method/equal_value_spec.rb + http://github.com/rubyspec/rubyspec/blob/master/ core/method/shared/eql.rb似乎涵盖了`m.method(:bar)== m.method(:foo)`当一个是另一个的别名时. (2认同)