为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
相关产品推荐
相关产品推荐

