Ruby 是否有一种优雅的方法来测试一个实例方法是否是另一个实例方法的别名?
在单元测试中,我需要测试alias_方法定义的alias方法是否已正确定义。我可以简单地对原版使用的别名使用相同的测试,但我想知道是否有更确定或更有效的解决方案。例如,是否有方法1)取消引用方法别名并返回其原始名称,2)获取并比较某种基础方法标识符或地址,或3)获取并比较方法定义?例如: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
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