Apollo联邦子图集成测试:扩展类型引用报错解决方案咨询
联邦子图集成测试解决方案
你遇到的问题核心是测试环境未识别GraphQL联邦专属指令(@key、@external),且缺少被扩展类型(Collection)的基础定义。以下是几种可行的解决方式:
1. 用联邦工具构建测试Schema
如果使用Apollo Federation,不要用普通的GraphQL Schema构建方法,改用buildSubgraphSchema(来自@apollo/federation或@apollo/subgraph)构建子图Schema。该方法会自动识别并处理联邦专属指令,避免Unknown directive类错误。
示例代码(基于Apollo Server):
import { buildSubgraphSchema } from '@apollo/subgraph'; import { typeDefs, resolvers } from './your-subgraph-code'; // 测试时通过该方法构建Schema const schema = buildSubgraphSchema([{ typeDefs, resolvers }]);
2. 为外部实体添加最小化基础定义
在测试用Schema中,手动添加被扩展类型的基础结构,让测试环境能识别Collection类型。无需实现完整字段,仅保留@key指定的标识字段即可:
// 测试用基础类型定义,放在原有extend语句之前 type Collection @key(fields: "id") { id: String! } // 子图原有extend定义 extend type Collection @key(fields: "id") { id: String! @external itemId: Int }
3. Mock外部实体的Resolver(按需)
如果测试逻辑需要访问外部实体的字段,可为Collection类型添加Mock Resolver,返回预设测试数据:
const mockResolvers = { Collection: { id: () => 'test-collection-id', // 按需添加其他需要Mock的外部字段 }, }; // 构建Schema时合并Mock Resolver与子图原有Resolver const schema = buildSubgraphSchema([{ typeDefs: [...testTypeDefs, yourTypeDefs], resolvers: {...mockResolvers, yourResolvers} }]);
4. 单子网集成测试最佳实践
- 单子网测试无需启动整个联邦网关或其他子图,只需保证当前子图Schema合法、Resolver逻辑正确即可。
- 优先用
buildSubgraphSchema处理联邦指令,避免手动维护指令定义。 - 外部实体仅保留最小化基础定义,避免引入不必要的依赖。
内容的提问来源于stack exchange,提问作者LoneWolfPR
相关产品推荐
相关产品推荐

