我的模拟测试是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)添加之后,结果也是假的和空的.

推荐答案

设置CallBasetrue:

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

EqualsGetHashCode也都是虚方法,除非您将CallBase设置为true,否则Moq也会用‘mock’实现覆盖这些方法.

这是否能解决问题并不是很明显,但在我对操作的再现中,它确实解决了问题.测试现在通过了.

Csharp相关问答推荐

将修剪声明放入LINQ中

为什么我不能更改尚未设置的模拟对象属性的值?

为什么我的ASP.NET核心MVC应用程序要为HTML元素添加一些标识符?

不仅仅是一个简单的自定义按钮

实体框架核心上是否支持使用NPGSQL的字符串聚合?

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

实体框架核心中的ComplexType和OwnsOne有什么不同?

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

JsonSchema.Net删除假阳性判断结果

C#自定义验证属性未触发IsValid方法

等待一个等待函数

如何更改新创建的实例的变量?

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

我找不到ASP.NET Web应用程序(.NET框架).已 Select .NET框架项目和项模板以及此组件(&Q;)

获取应用程序版本信息时出现奇怪信息

除非首先访问使用的终结点,否则本地API上的终结点不起作用