You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为C# GraphQL函数应用写单元测试时遇ITypeReference加载失败

问题描述

我正尝试为我们的GraphQL C#函数应用编写单元测试,按照Chilicream官网的视频教程操作,但卡在了教程的第一步。

当前测试代码

public class SimpleTest
{
    [Fact]
    public async Task SchemaChangeTest()
    {
        var schema = 
            await new ServiceCollection()
            .AddGraphQLServer()
            .AddQueryType(q => q.name("PHQuery")) // 从FA的Program.cs复制的代码
            //.AddQueryType<InventoryQuery>(q => q.name("PHQuery")) 试过这个,没用
            .AddType<InventoryQuery>()
            .BuildSchemaAsync();

            schema.toString().MatchSnapshot();
    }
}

测试抛出的异常

HotChocolate.SchemaException : 更多细节请查看'Errors'属性。

1. Could not load type 'HotChocolate.Types.Descriptors.ITypeRefernce' from assembly 'HotChocolate.Types... (HotChocolate.Types.ObjectTypeExtension<PH.Core.Queries.InventoryQuery>)

我完全不知道该如何解决,找不到相关的有效信息,恳请各位提供帮助。

提前感谢!


编辑1:补充代码

InventoryQuery.cs

using PH.Core.Interfaces;
using PH.Core.Models;

namespace PH.Core.Queries
{
    [ExtendObjectType("PHQuery")]
    public class InventoryQuery
    {
        [UseOffesetPaging(IncludeTotalCount = true, MaxPageSize = (int.MaxValue - 1), DefaultPageSize = int.MaxValue)]
        [UseFiltering()]
        [UseSorting]
        public IQueryable<Inventory> GetInventory([Service] 
            IInventoryRepository inventoryRepository){
            return inventoryRepository.GetInventory();
        }
    }
}

Program.cs(部分代码)

...
var host = new HostBuilder()
...
    .ConfigureServices(services => 
    {
        ...
        services.AddTransient<IInventoryRepository,InventoryRepository>();
        ...
        services.AddGraphQLServer()
            .RegisterDbContext<PHContext>()
            .AddFiltering()
            .AddSorting()
            .AddQueryType(q => q.Name("PHQuery"))
            .AddType<InventoryQuery>();
        ...
     });

解决方案

针对你遇到的ITypeReference(注意异常里拼写错误为ITypeRefernce,大概率是版本不匹配导致)加载失败问题,按以下步骤排查修复:

  • 统一HotChocolate包版本
    确保测试项目和主项目引用的所有HotChocolate相关NuGet包(如HotChocolate.AspNetCore、HotChocolate.Data、HotChocolate.Testing等)版本完全一致,版本差异是这类类型加载错误的核心诱因。

  • 补全测试代码的GraphQL配置
    你的测试代码缺少主项目中配置的GraphQL扩展服务,需要同步添加必要配置项:

    public class SimpleTest
    {
        [Fact]
        public async Task SchemaChangeTest()
        {
            var schema = 
                await new ServiceCollection()
                .AddGraphQLServer()
                .AddQueryType(q => q.Name("PHQuery"))
                .AddType<InventoryQuery>()
                // 补充主项目中的核心配置
                .AddFiltering()
                .AddSorting()
                .BuildSchemaAsync();
    
            schema.ToString().MatchSnapshot();
        }
    }
    
  • 修正代码拼写错误
    测试代码里的q.name("PHQuery")是小写name,需改为大写Name(和主项目保持一致),避免后续潜在问题。

  • 确认测试项目依赖引用
    确保测试项目正确引用了包含InventoryQuery、IInventoryRepository等类型的主项目/类库,且依赖项已正常构建。

  • 清理重建解决方案
    删除所有项目的bin、obj目录,重新构建整个解决方案,避免旧版本dll残留引发类型冲突。

内容的提问来源于stack exchange,提问作者Rob M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:47:37