A nock-based GraphQL testing library that provides a functionality to mock queries and mutations.
In contrast to Apollo's MockedProvider, nock allows a realistic testing with the actual http calls being made from your client code.
You'll need nock, cross-fetch as peer dependencies in order to use this library.
npm install -D nock-graphql nock cross-fetch
Additionally, you need to set up global fetch implementation incorporated in your jest environment:
global.fetch = require('cross-fetch')
or, directly in your ApolloClient
const client = new ApolloClient({
link: new HttpLink({ fetch, uri: ENDPOINT }),
});
I. Create nock-graphql instance
A. You could create it globally:
// Create the instance in a separate file and export it.
import { NockGraphQL } from 'nock-graphql';
export const nockgql = new NockGraphQL('http://localhost:4000/graphql');B. Create directly in the test files:
import { NockGraphQL } from 'nock-graphql';
let nockgql: NockGraphQL;
beforeAll(() => {
nockgql = new NockGraphQL('http://localhost:4000/graphql');
});II. Mocking queries
import { gql } from 'graphql-tag';
import { ApolloClient, HttpLink, InMemoryCache } from '@apollo/client';
import { MockConfig } from 'nock-graphql';
type QueryVariables = {
id: string;
};
type QueryResult = {
foo: { bar: string };
};
const GetQuery = gql`
query Test($id: String) {
foo(id: $id) {
bar
}
}
`;
beforeEach(() => {
client = new ApolloClient({
link: new HttpLink({ uri: 'http://localhost:4000/graphql' }),
cache: new InMemoryCache({ addTypename: false }),
});
});
afterEach(() => {
nockgql.cleanup();
});
test('should match the query', async () => {
const config: MockConfig<QueryVariables, QueryResult> = {
document: GetQuery,
variables: { id: '1' },
data: {
foo: {
bar: 'Hello, World',
},
},
};
const scope = nockgql.mock(config);
await client.query({ query: GetQuery, variables: { id: '1' } });
scope.done();
});