11

単体テストでは、alias_methodで定義されたエイリアスメソッドが適切に定義されているかどうかをテストする必要があります。オリジナルに使用されているエイリアスに対して同じテストを使用することもできますが、より明確な解決策や効率的な解決策があるかどうか疑問に思っています。たとえば、1)メソッドエイリアスを逆参照して元の名前を返す方法、2)ある種の基になるメソッド識別子またはアドレスを取得して比較する方法、または3)メソッド定義を取得して比較する方法はありますか?例えば:

class MyClass
  def foo
    # do something
  end

  alias_method :bar, :foo
end

describe MyClass do
  it "method bar should be an alias for method foo" do
    m = MyClass.new
    # ??? identity(m.bar).should == identity(m.foo) ???
  end
end

提案?

4

3 に答える 3

18

メソッドのドキュメントによると、

同じオブジェクトにバインドされ、同じ本体を含む場合、2つのメソッドオブジェクトは等しくなります。

返されるオブジェクトを呼び出しObject#methodて比較するMethodと、メソッドが同等であることが確認されます。

m.method(:bar) == m.method(:foo)
于 2010-10-06T05:44:10.887 に答える
3

bk1eのメソッドはほとんどの場合機能しますが、たまたま機能しない場合があります。

class Stream
  class << self
    alias_method :open, :new
  end
end

open = Stream.method(:open)
new = Stream.method(:new)
p open, new                   # => #<Method: Stream.new>, #<Method: Class#new>
p open.receiver, new.receiver # => Stream, Stream
p open == new                 # => false

true出力はRuby1.9で生成されますが、Ruby 1.8が最後の行で生成されるため、バグかどうかはわかりません。したがって、1.9を使用している場合は、継承されたクラスメソッド(Class#newなど)をエイリアスする場合は注意してください。これら2つのメソッドは同じオブジェクト(クラスオブジェクトStream)にバインドされますが、Ruby1.9では同等ではないと見なされます。

私の回避策は簡単です。元のメソッドに再度エイリアスを作成し、2つのエイリアスの同等性をテストします。

class << Stream; alias_method :alias_test_open, :new; end
open = Stream.method(:open)
alias_test_open = Stream.method(:alias_test_open)
p open, alias_test_open                   # => #<Method: Stream.new>, #<Method: Stream.new>
p open.receiver, alias_test_open.receiver # => Stream, Stream
p open == alias_test_open                 # => true

お役に立てれば。

アップデート:

http://bugs.ruby-lang.org/issues/7613を参照してください

したがってMethod#==、この場合、super呼び出しはさまざまなメソッドを呼び出すため、falseを返す必要があります。バグではありません。

于 2012-12-23T21:21:03.717 に答える
1

呼び出すMyClass.instance_method(:foo)と、メソッドを持つUnboundMethodインスタンスが生成されますeql?

したがって、答えは次のとおりです。

describe MyClass do
  subject { described_class }

  specify do
    expect(subject.instance_method(:foo)).to be_eql(subject.instance_method(:bar))
  end
end
于 2015-06-12T14:10:05.057 に答える