如何测试方法别名ruby



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

假设我们有

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)

您可以使用:

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

oldergod的答案适用于大多数场景:

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

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

def a
  return 'test string'
end

那么it{expect(Test.b).to eq(Test.a)}

可以吗?

最新更新