Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否有一种优雅的方法来测试一个实例方法是否是另一个实例方法的别名?_Ruby_Reflection_Alias Method - Fatal编程技术网

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

Ruby 是否有一种优雅的方法来测试一个实例方法是否是另一个实例方法的别名?,ruby,reflection,alias-method,Ruby,Reflection,Alias Method,在单元测试中,我需要测试alias_方法定义的alias方法是否已正确定义。我可以简单地对原版使用的别名使用相同的测试,但我想知道是否有更确定或更有效的解决方案。例如,是否有方法1)取消引用方法别名并返回其原始名称,2)获取并比较某种基础方法标识符或地址,或3)获取并比较方法定义?例如: class MyClass def foo # do something end alias_method :bar, :foo end describe MyClass do it

在单元测试中,我需要测试alias_方法定义的alias方法是否已正确定义。我可以简单地对原版使用的别名使用相同的测试,但我想知道是否有更确定或更有效的解决方案。例如,是否有方法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

建议?

根据

两个方法对象相等,如果 都绑定到同一对象,并且 包含相同的主体

调用并比较它返回的
方法
对象将验证这些方法是否等效:

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

bk1e的方法在大多数情况下都是有效的,但我碰巧遇到了它不起作用的情况:

class Stream
  class << self
    alias_method :open, :new
  end
end

open = Stream.method(:open)
new = Stream.method(:new)
p open, new                   # => #<Method: Stream.new>, #<Method: Class#new>
p open.receiver, new.receiver # => Stream, Stream
p open == new                 # => false
希望这有帮助

更新:


因此
Method#=
在这种情况下应该返回false,因为
super
调用将调用不同的方法;这不是一个bug。

调用
MyClass.instance\u方法(:foo)
将生成实例,该实例具有
eql?
方法

所以答案是:

describe MyClass do
  subject { described_class }

  specify do
    expect(subject.instance_method(:foo)).to be_eql(subject.instance_method(:bar))
  end
end

我确信我记得这不起作用,但我只是试着确认一下,它在Ruby 1.8、1.9和MacRuby中一直有效。但是我仍然没有在RubySpec中看到它,所以它很可能不会在无关的实现上工作。而且,一般来说,只有相同的实体但没有从另一个复制的方法是不平等的。证明:
Class.new{def foo()end;def bar()end;put实例方法(:foo)==实例方法(:bar)}
@Chuck:谢谢你指出这一点。我应该试一下。另外,+中的“在别名方法上返回true”似乎涵盖了
m.method(:bar)==m.method(:foo)
,其中一个是另一个的别名。可能是
describe MyClass do
  subject { described_class }

  specify do
    expect(subject.instance_method(:foo)).to be_eql(subject.instance_method(:bar))
  end
end