単体テストに Moq フレームワークを使用していますが、この興味深い問題に遭遇しました。
public interface Bar : IEquatable<Bar>
{
}
[TestClass]
public class TestClass
{
Mock<Bar> a;
Mock<Bar> b;
public TestClass()
{
a = new Mock<Bar>();
b = new Mock<Bar>();
a.Setup(bar => bar.Equals(b.Object)).Returns(true);
}
[TestMethod]
public void AssertEqualsTest()
{
Assert.AreEqual(a.Object, b.Object); //fails
}
[TestMethod]
public void AssertIsTrueTest()
{
Assert.IsTrue(a.Object.Equals(b.Object)); //passes
}
}
創刊
だからAssert.AreEqual
失敗するだけです。クラスのほとんど (すべてではないにしても) が IEquatable を継承しているにもかかわらず、等価性をチェックする必要があるたびに 2 番目のテストの行を使用する必要はありません。
Assert.AreEqual
Setup が IEquality.Equals() 関数 (おそらくチェックしない) のみを設定しているため、失敗したと思うかもしれませんが、次の行を追加すると、
a.Setup(x => x.Equals((object)b.Object)).Returns(true);
コンストラクターに対して、それはまだ失敗します。
第二号
: IEquatable<Bar>
インターフェイス宣言からをコメントアウトすると( がa.Setup
上書きされるようにobject.Equals
)、両方のテストが失敗します。
私の望む結果は、Mock
オブジェクトに equals を設定して を呼び出すことができるようにすることAssert.AreEqual
です。