GraphQL schema mocking utilities with stateful stores and realistic test data generation
npx @tessl/cli install tessl/npm-graphql-tools--mock@9.0.0GraphQL Tools Mock provides comprehensive utilities for creating mock implementations of GraphQL schemas during development and testing. It enables developers to generate realistic test data, maintain stateful mock stores for consistent queries, and create mock servers without implementing full resolvers.
npm install @graphql-tools/mockimport {
addMocksToSchema,
createMockStore,
MockStore,
MockList,
mockServer,
relayStylePaginationMock,
isRef,
assertIsRef,
makeRef
} from "@graphql-tools/mock";
// defaultMocks is also available from the main export:
import { defaultMocks } from "@graphql-tools/mock";For CommonJS:
const {
addMocksToSchema,
createMockStore,
MockStore,
MockList,
mockServer,
relayStylePaginationMock,
isRef,
assertIsRef,
makeRef
} = require("@graphql-tools/mock");
// defaultMocks is also available from the main export:
const { defaultMocks } = require("@graphql-tools/mock");import { buildSchema } from "graphql";
import { addMocksToSchema, createMockStore } from "@graphql-tools/mock";
// Create a simple schema
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
users: [User!]!
}
`);
// Add mocks to schema with custom mock functions
const mockedSchema = addMocksToSchema({
schema,
mocks: {
User: () => ({
id: () => Math.random().toString(36).substr(2, 9),
name: () => ['Alice', 'Bob', 'Charlie'][Math.floor(Math.random() * 3)],
email: () => 'user@example.com'
})
}
});
// Use a stateful mock store for consistent data
const store = createMockStore({ schema });
const mockedSchemaWithStore = addMocksToSchema({
schema,
store
});GraphQL Tools Mock is built around several key components:
addMocksToSchema transforms existing schemas by adding mock resolversMockStore provides consistent data across multiple queries with reference trackingMockList for generating arrays with controlled length and contentCore schema mocking functionality that adds mock resolvers to GraphQL schemas. Essential for development servers and testing environments where you need realistic data without backend implementation.
function addMocksToSchema<TResolvers = IResolvers>({
schema,
store?: IMockStore,
mocks?: IMocks<TResolvers>,
typePolicies?: { [typeName: string]: TypePolicy },
resolvers?: Partial<TResolvers> | ((store: IMockStore) => Partial<TResolvers>),
preserveResolvers?: boolean
}: IMockOptions<TResolvers>): GraphQLSchema;
interface IMockOptions<TResolvers> {
schema: GraphQLSchema;
store?: IMockStore;
mocks?: IMocks<TResolvers>;
typePolicies?: { [typeName: string]: TypePolicy };
resolvers?: Partial<TResolvers> | ((store: IMockStore) => Partial<TResolvers>);
preserveResolvers?: boolean;
}Stateful storage system for consistent mock data across queries. Provides reference tracking, data persistence, and advanced querying capabilities for complex testing scenarios.
class MockStore implements IMockStore {
constructor(options: {
schema: GraphQLSchema;
mocks?: IMocks;
typePolicies?: { [typeName: string]: TypePolicy };
});
get<KeyT extends KeyTypeConstraints = string>(
typeName: string,
key?: KeyT,
defaultValue?: { [fieldName: string]: any }
): unknown | Ref<KeyT>;
set<KeyT extends KeyTypeConstraints = string>(
typeName: string,
key: KeyT,
values: { [fieldName: string]: any }
): void;
has<KeyT extends KeyTypeConstraints = string>(typeName: string, key: KeyT): boolean;
reset(): void;
}
function createMockStore(options: {
schema: GraphQLSchema;
mocks?: IMocks;
typePolicies?: { [typeName: string]: TypePolicy };
}): IMockStore;Quick mock server creation for testing and development. Provides a simple interface for executing queries against mocked schemas without complex setup.
function mockServer<TResolvers>(
schema: TypeSource,
mocks: IMocks<TResolvers>,
preserveResolvers?: boolean
): IMockServer;
interface IMockServer {
query: (query: string, vars?: Record<string, any>) => Promise<ExecutionResult>;
}Specialized utilities for mocking array and list fields with controlled length and content generation.
class MockList {
constructor(length: number | Array<number>, mockFunction?: () => unknown);
mock(): Array<unknown>;
}
function isMockList(obj: any): obj is MockList;
function deepResolveMockList(mockList: MockList): unknown[];Relay-style pagination utilities for implementing cursor-based pagination in mock resolvers.
const relayStylePaginationMock: <TContext, TArgs extends RelayPaginationParams>(
store: IMockStore,
options?: RelayStylePaginationMockOptions<TContext, TArgs>
) => IFieldResolver<Ref, TContext, TArgs, any>;
type RelayPaginationParams = {
first?: number;
after?: string;
last?: number;
before?: string;
};Helper utilities for working with references, data validation, and mock generation.
function isRef<KeyT extends KeyTypeConstraints = string>(
maybeRef: unknown
): maybeRef is Ref<KeyT>;
function assertIsRef<KeyT extends KeyTypeConstraints = string>(
maybeRef: unknown,
message?: string
): asserts maybeRef is Ref<KeyT>;
function makeRef<KeyT extends KeyTypeConstraints = string>(
typeName: string,
key: KeyT
): Ref<KeyT>;
function isRecord(obj: unknown): obj is { [key: string]: unknown };
function uuidv4(): string;
const randomListLength: () => number;
const takeRandom: <T>(arr: T[]) => T;// Mock Configuration Types
type IMocks<TResolvers = IResolvers> = {
[TTypeName in keyof TResolvers]?: {
[TFieldName in keyof TResolvers[TTypeName]]:
TResolvers[TTypeName][TFieldName] extends (args: any) => any
? () => ReturnType<TResolvers[TTypeName][TFieldName]> | ReturnType<TResolvers[TTypeName][TFieldName]>
: TResolvers[TTypeName][TFieldName];
};
} & {
[typeOrScalarName: string]: IScalarMock | ITypeMock;
};
type IScalarMock = unknown | IMockFn;
type ITypeMock = () => { [fieldName: string]: unknown | IMockFn };
type IMockFn = () => unknown;
// Reference Types
type Ref<KeyT extends KeyTypeConstraints = string> = {
$ref: {
key: KeyT;
typeName: string;
};
};
type KeyTypeConstraints = string | number;
// Type Policy Configuration
type TypePolicy = {
keyFieldName?: string | false;
};
// Store Interface
interface IMockStore {
schema: GraphQLSchema;
get<KeyT extends KeyTypeConstraints = string>(
typeName: string,
key?: KeyT,
defaultValue?: { [fieldName: string]: any }
): unknown | Ref<KeyT>;
set<KeyT extends KeyTypeConstraints = string>(
typeName: string,
key: KeyT,
values: { [fieldName: string]: any }
): void;
has<KeyT extends KeyTypeConstraints = string>(typeName: string, key: KeyT): boolean;
reset(): void;
}