我正在使用 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。
您可能认为它失败了,因为安装程序仅设置 IEquality.Equals() 函数(Assert.AreEqual
可能不会检查),但如果您添加该行
a.Setup(x => x.Equals((object)b.Object)).Returns(true);
对于构造函数,它仍然失败。
第二期
如果您从接口声明中注释掉: IEquatable<Bar>
(以便a.Setup
覆盖object.Equals
),则两个测试都会失败。
我想要的结果是能够在Mock
对象上设置 equals 并调用Assert.AreEqual
.