gpt4 book ai didi

c# - Moq Equals 仅适用于 IEquatable

转载 作者:行者123 更新时间:2023-11-30 14:36:13 26 4
gpt4 key购买 nike

我正在使用 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>从接口(interface)声明(因此 a.Setup 覆盖 object.Equals ),两个测试都失败了。

我想要的结果是能够在 Mock 上设置 equals反对并调用 Assert.AreEqual .

最佳答案

第一期

通过 dotPeek 检查。 Assert.AreEqual 调用静态方法 object.Equals 来比较实例。 object.Equals 首先使用 operator == 并且由于模拟实例未实现该运算符,因此这将默认为比较引用。显然,a 和 b 是不同的实例,因此比较返回 false。

第二期

我没有查看 Moq 的内部结构,但我认为发生这种情况是因为该接口(interface)未声明 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,这个问题可以用这个 Q&A 来解释。 .

无论如何,我认为您现在使用 Assert.IsTrue(a.Object.Equals(b.Object));IEquatable 所做的是一个足够的解决方法为此。

顺便说一下,正如 JaredPar 上面所问的,你为什么要比较模拟?

关于c# - Moq Equals 仅适用于 IEquatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10826199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com