如何测试方法别名ruby

Fil*_*uzi 3 ruby rspec ruby-on-rails ruby-on-rails-4

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

让我们说我们有

Class Test
  class << self
    def a;end
    alias :b :a
  end
end
Run Code Online (Sandbox Code Playgroud)

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

it { expect(Test.b).to receive(:a) }
Run Code Online (Sandbox Code Playgroud)

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

old*_*god 13

您可以使用Object#方法.

Test.method(:b) == Test.method(:a)
Run Code Online (Sandbox Code Playgroud)

  • 要在 `Test` 实例方法上使用它: `Test.new.method(:b) == Test.new.method(:a)` (2认同)

Arn*_*Roa 6

您可以使用:

expect(obj.method(:method)).to eq(obj.method(:alias))
Run Code Online (Sandbox Code Playgroud)


Jef*_*ian 6

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

Test.method(:b) == Test.method(:a)
Run Code Online (Sandbox Code Playgroud)

不幸的是,当这两个方法具有不同的所有者时(例如,当方法在模块中定义,而别名在包含该模块的类中定义时)它在 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
Run Code Online (Sandbox Code Playgroud)