我的模拟测试抛出了
KeyNotFoundException
:
[Fact]
public void MockAssembly_GetTypes_ReturnsMockedTypes()
{
var mockAssembly = new Mock<Assembly>();
mockAssembly.Setup(a => a.GetTypes()).Returns(new Type[] { typeof(MyClass) });
var mockAssemblyObject = mockAssembly.Object;
var assemblyDictionary = new Dictionary<Assembly, HashSet<Type>>();
if (!assemblyDictionary.TryGetValue(mockAssemblyObject, out var types))
{
types = new HashSet<Type>(mockAssemblyObject.GetTypes());
assemblyDictionary[mockAssemblyObject] = types;
}
Assert.Contains(mockAssemblyObject, assemblyDictionary.Keys);
Assert.Single(assemblyDictionary[mockAssemblyObject]);
}
System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键“”。
上线了
Assert.Single(assemblyDictionary[mockAssemblyObject]);
即使嘲笑
GetHashCode
也无济于事 - 它仍然尝试使用空键。
为什么会出现这种情况?
编辑:
进一步的测试显示,如果我在使用
assemblyDictionary.TryGetValue(mockAssemblyObject, out var myTypes);
添加后立即调用 assemblyDictionary.Add(mockAssemblyObject, types)
,结果将为 false 且为 null。
将
CallBase
设置为 true
:
var mockAssembly = new Mock<Assembly>() { CallBase = true };
Equals
和GetHashCode
都是虚拟方法,除非您将CallBase
设置为true
,否则Moq也会用“模拟”实现覆盖这些方法。
这解决了问题并不是很明显,但在我的 OP 重现中,它确实解决了。测试现已通过。