设置 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();如果您已经到达这里,那么我已经尽力让您继续阅读。请留下任何评论或分享更正。