我正在使用 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
}
}
首要问题
So Assert.AreEqual
只是失败了。我不想每次需要检查相等性时都必须使用第二次测试中的行,即使我的大多数(如果不是全部)类都继承自 IEquatable。
您可能认为它失败了,因为安装程序仅设置 IEquality.Equals() 函数(该函数Assert.AreEqual
可能不会检查),但是如果您添加该行
a.Setup(x => x.Equals((object)b.Object)).Returns(true);
对于构造函数,它仍然失败。
第二期
如果你注释掉: IEquatable<Bar>
从接口声明(这样a.Setup
覆盖object.Equals
),两个测试都失败。
我想要的结果是能够在Mock
对象和调用Assert.AreEqual
.
首要问题
通过 dotPeek 检查。Assert.AreEqual
调用静态方法object.Equals
来比较实例。object.Equals
uses operator ==
首先,由于模拟实例没有实现该运算符,因此这将默认比较引用。显然,a 和 b 是不同的实例,因此比较返回 false。
第二期
我还没有查看 Moq 的内部结构,但我认为发生这种情况是因为该接口没有声明 Equals 方法。确认以下内容(成功):
public interface IBar
{
}
public class Bar : IBar
{
public override bool Equals(object obj)
{
return false;
}
}
[TestClass]
public class Class1
{
[TestMethod]
public void TestMoq()
{
var a = new Mock<Bar>();
var b = new Mock<Bar>();
a.Setup(bar => bar.Equals(b.Object)).Returns(true);
Assert.IsTrue(a.Object.Equals(b.Object));
}
}
如果我删除Bar.Equals
覆盖,测试也会失败。只是一个猜测,但由于 Moq 在内部使用 Castle,这个问题可以这样解释.
无论如何,我认为你现在正在做什么Assert.IsTrue(a.Object.Equals(b.Object));
and IEquatable
是一个足够的解决方法。
顺便说一句,正如 JaredPar 上面所问的,你为什么要比较模拟?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)