我有我认为应该是一个非常简单的测试用例,但是每次我运行它时 QTAgent32 都会死掉。在调试模式下运行测试用例显示System.StackOverflowException
在“未知模块”中被抛出。我已将其缩小到表现出这种行为的最基本的实现(.NET 4 和 VS 2010 Ultimate):
[TestClass]
public class StackOverflow
{
[TestMethod]
public void CreateStackOverflow()
{
var mockMyType1 = new Mock<MyType>();
mockMyType1.Setup(m => m.Equals(mockMyType1.Object)).Returns(true);
var mockMyType2 = new Mock<MyType>();
// Real test is for a filtering routine and the Assert is using
// Contains(), but it uses Equals() internally so it has the same problem
Assert.IsTrue(mockMyType1.Object.Equals(mockMyType1.Object)); // returns true
Assert.IsFalse(mockMyType1.Object.Equals(mockMyType2.Object)); // explodes
}
}
public class MyType
{
public virtual bool IsActive { get; set; }
public override bool Equals(object obj)
{
return false; // Not the real implementation but irrelevant to this issue
}
}
我觉得我错过了一些关于关闭或起订量的重要信息,但这似乎应该可行。我尝试过的事情,试图理解这个问题,但只会让我更加困惑:
- 我尝试将 Equals() 设置替换为,
mockMyType.Setup(m => m.Equals(m)).Returns(true);
但这会导致 Moq 抛出 NotSupportedException - 如果我让 CallBase 为真而不是设置 Equals(),一切正常
- 最后,如果 MyType 类没有覆盖 Equals(),那么一切正常。
谁能指出我可能发生的事情的方向?我完全不知所措。
编辑:我相信我有几个选择来完成这项工作(包括下面 Lanorkin 的回复),但我真的很想知道为什么会这样。我做错了什么,或者我应该提交 Moq 或 Visual Studio 中的错误吗?
更新:我最终选择了下面的 Denys 解决方案版本并向 Moq 提交错误报告。我的设置现在看起来像:
mockMyType1.Setup(m => m.Equals(It.Is<MyType>(x => ReferenceEquals(x, mockMyType1.Object)))).Returns(true);