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)
您可以使用:
expect(obj.method(:method)).to eq(obj.method(:alias))
Run Code Online (Sandbox Code Playgroud)
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_name或Method#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)
| 归档时间: |
|
| 查看次数: |
2490 次 |
| 最近记录: |