The strongly-typed nature of a GraphQL API lends itself extremely well to mocking. This is an important part of a GraphQL-First development process, because it enables frontend developers to build out UI components and features without having to wait for a backend implementation.
Even when the UI is already built, it can let you test your UI without waiting on slow database requests, or build out a component harness using a tool like React Storybook without needing to start a real GraphQL server.
Let’s take a look at how we can mock a GraphQL schema with just one line of code, using the default mocking logic you get out of the box with
graphql-tools. To start, let’s grab the schema definition string from the
makeExecutableSchema example in the “Generating a schema” article.
Note: If your schema has custom scalar types, you still need to define the
__parseLiteralfunctions, and pass them inside the second argument to
This mocking logic simply looks at your schema and makes sure to return a string where your schema has a string, a number for a number, etc. So you can already get the right shape of result. But if you want to use the mocks to do sophisticated testing, you will likely want to customize them to your particular data model.
This is where the
mocks option comes in, it’s an object that describes your desired mocking logic. This is similar to the
makeExecutableSchema, but has a few extra features aimed at mocking.
It allows you to specify functions that are called for specific types in the schema, for example:
You can also use this to describe object types, and the fields can be functions too:
You can also use the MockList constructor to automate mocking a list:
Since the mock functions on fields are actually just GraphQL resolvers, you can use arguments and context in them as well:
You can read some background and flavor on this approach in our blog post, “Mocking your server with one line of code”.
Interface mock functions must return an object with a
Given an instance of GraphQLSchema and a mock object,
addMockFunctionsToSchema modifies the schema in place to return mock data for any valid query that is sent to the server. If
mocks is not passed, the defaults will be used for each of the scalar types. If
preserveResolvers is set to
true, existing resolve functions will not be overwritten to provide mock data. This can be used to mock some parts of the server and not others.
This is an object you can return from your mock resolvers which calls the
mockFunction once for each list item. The first argument can either be an exact length, or an inclusive range of possible lengths for the list, in case you want to see how your UI responds to varying lists of data.