如何测试方法别名ruby

时间:2014-09-17 06:22:01

标签: ruby-on-rails ruby ruby-on-rails-4 rspec

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

我们说我们有

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

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

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

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

4 个答案:

答案 0 :(得分:13)

您可以使用Object#method

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

答案 1 :(得分:3)

oldergod的答案适用于大多数情况:

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

不幸的是,当两个方法拥有不同的所有者时,它在Ruby 2.3+中不起作用(例如,当在模块中定义方法时,别名在包含模块的类中定义)。这是因为the behavior of Method#== changed in Ruby 2.3

  

如果方法的所有者不同,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

答案 2 :(得分:2)

您可以使用:

B

答案 3 :(得分:-2)

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

def a
  return 'test string'
end

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

没关系?

相关问题