如何测试方法别名ruby

如何测试方法是否有别名?

假设我们有

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

到目前为止,我想出了写这个规范的想法:

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

但我相信有更好的解决方案。 有任何想法吗?

您可以使用Object#方法 。

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

在大多数情况下, oldgod的答案都有效:

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

不幸的是,当两个方法具有不同的所有者它在Ruby 2.3+中不起作用(例如,当在模块中定义方法时,别名在包含模块的类中定义)。 这是因为Ruby 2.3中Method#==的行为发生了变化 :

如果方法的所有者不同,则super的行为在方法中是不同的,因此Method#==不应该为方法返回true。

如果您发现自己处于这种情况,您希望测试两个方法是彼此的别名但是它们具有不同的所有者,则可以使用Method#original_nameMethod#source_location

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

您可以使用:

 expect(obj.method(:method)).to eq(obj.method(:alias)) 

您可以将结果设置为函数以检查结果是否相同。

 def a return 'test string' end 

然后它{expect(Test.b).to eq(Test.a)}

好吗?