尝试访问字典中的模拟对象时出现KeyNotFoundException

问题描述 投票:0回答:1

我的模拟测试抛出了

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。

c# moq xunit
1个回答
1
投票

CallBase
设置为
true
:

var mockAssembly = new Mock<Assembly>() { CallBase = true };

Equals
GetHashCode
都是虚拟方法,除非您将
CallBase
设置为
true
,否则Moq也会用“模拟”实现覆盖这些方法。

这解决了问题并不是很明显,但在我的 OP 重现中,它确实解决了。测试现已通过。

© www.soinside.com 2019 - 2024. All rights reserved.