设置 GraphQL Mock 服务器
介绍
本教程将指导您为 JavaScript 应用程序创建 GraphQL 模拟服务器。模拟服务器对于本地开发非常有用,可以在后端不可用或运行 E2E 测试时实现无缝测试。
先决条件
继续之前,请确保您的系统上安装了以下工具:
循序渐进指南
1.安装依赖项
首先使用 npm 或 yarn 安装必要的依赖项:
npm install --save-dev graphql graphql-tag graphql-tools @apollo/server node-fetch
2. 设置项目结构
按如下方式设置您的项目目录:
/graphql-mock-server |-- localSchema.ts |-- schema.graphql |-- server.ts
3. 本地模式
在 localSchema.ts 中定义本地架构。此架构将覆盖特定查询或突变的远程架构定义。提供解析器以返回预定义的模拟数据。
// filepath: /graphql-mock-server/localSchema.ts import { makeExecutableSchema } from '@graphql-tool/schema' import { gql } from 'graphql-tag' const typeDefs = gql` type Query { myQuery: String } `; const resolvers = { Query: { myQuery: () => 'This is mock data' }, }; export const localSchema = makeExecutableSchema({typeDefs, resolvers});
4. 远程模式
远程模式从本地文件“schema.graphql”加载。此文件应包含模式定义,可从 GraphQL 游乐场导出。
// filepath: /graphql-mock-server/schema.graphql type Query { myQuery: String }
5.模拟服务器实现
模拟服务器将本地和远程模式连接起来,优先考虑本地模式指定的查询或变异。
// filepath: /graphql-mock-server/server.ts import { ApolloServer } from '@apollo/server'; import { startStandaloneServer } from '@apollo/server/standalone'; import { stitchSchema } from '@graphql-tools/stitch'; import { loadSchemaSync } from '@graphql-tools/load'; import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; import { localSchema } from './localSchema'; import { wrapSchema } from '@graphql-tools/wrap'; import { print } from 'graphql'; import fetch from 'node-fetch'; async function startServer(){ const remoteSchema = loadSchemaSync('graphql-mock-server/schema.graphql',{ loaders: [new GraphQLFileLoader()], }); const executableRemoteSchema = wrapSchema({ schema: remoteSchema, executor: async ({ document, variables }) => { const query = print(document); const fetchResult = await fetch( 'https://graphql.server.com/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json'}, body: JSON.stringify({ query, variables}), }, ); return fetchResult.json(); }, }); const schema = stitchSchema ({ subschema: [ { schema: executableRemoteSchema }, { schema: localSchema }, merge: { myQuery: { //override the Query/Mutation here selectionSet: '{ __typename }', resolve: (parent, args, context, info) => { return localSchema .getQueryType() ?.getFields() .myQuery.resolve(parent, args, context, info); }, }, }, }, }, ], }); const server = ApolloServer({ schema }); const {url } = await startStandaloneServer( server, { listen: { port: 4000}, }); console.log(`🚀 Server ready at ${url}`); } startServer();
如果您已经到达这里,那么我已经尽力让您继续阅读。请留下任何评论或分享更正。