2016-03-28 6 views
1

Moqがオブジェクトに対して.Equalsメソッドを設定する方法を理解できません。次のアサーションは失敗します。Moq - 偽を返す.Equalsメソッドを設定します。

var Song = new Mock<ISong>(); 
Song.Setup(x => x.Equals(Song.Object)) 
    .Returns(false); 

Assert.IsFalse(Song.Object.Equals(Song.Object)); 

つまり、Song.Object.Equals(Song.Object)は常にtrueを返します。

.Equalsの方法をMoqと偽装することは可能ですか?私は何が欠けていますか?

+0

Song.Equalsではなく、Song.Object.Equalsの設定をしています。 Song.Equals(Song.Object)をテストすると、falseを返します。 –

+0

さて、何を待っていますか? Mock.Objectを実際のモックとして使って、すべてのテストを書いた。それは他のすべての30以上のテストでも機能しました。なぜこれで失敗するのですか?編集:それは実際に彼らが最初のチュートリアルのエントリに表示されます:https://github.com/moq/moq4 – aspyct

+0

申し訳ありませんが、あなたは正しいです。私はあなたと同じことをして、同じ結果を得ました。私のISongインターフェースに "bool Equals(object obj)"を追加すると、それはうまくいく...私には意味がある...あなたが私にしたいなら、私は答えで詳しく述べることができる。 –

答えて

2

これはCastle.Coreの制限です(MoqとNSubstituteのような他のモックフレームワークで内部的に使用されています)。 System.Objectに定義された仮想メソッド、つまりToString,EqualsおよびGetHashCodeをオーバーライドすることはできません。

回避策は、継承ツリーのどこかでこれらのメソッドを手動でオーバーライドすることです。

public class Class {} 

var m = Mock.Of<Class>(c => 
    c.Equals(It.IsAny<object>()) == true 
    ); 

Assert.True(m.Equals(null)); 

をしかし、これは通過します::

例えば、これは失敗します

public class Class 
{ 
    public override bool Equals(object o) => base.Equals(o); 
} 

var m = Mock.Of<Class>(c => 
    c.Equals(It.IsAny<object>()) == true 
    ); 

Assert.True(m.Equals(null)); 

をあなたがインターフェイスを使用しているので、あなたは、単にそれにメソッドを宣言することができます:bool Equals(object o);

+0

それはそれを修正しました。ブリリアント:) – aspyct

関連する問題