GraphQL — это мощная альтернатива REST API, предлагающая гибкость в запросах и получение только тех данных, которые нужны. Однако, как и с любым API, важно проводить тщательное тестирование, чтобы убедиться, что система работает правильно. В этом контексте Mocha является отличным инструментом для автоматизации тестирования в JavaScript.
Mocha — это популярный фреймворк для тестирования, который предоставляет богатую функциональность для создания юнит-тестов, интеграционных тестов и тестов для API. В случае с GraphQL Mocha помогает написать тесты, которые взаимодействуют с сервером, выполняют запросы и проверяют ответы.
Перед тем как начать тестировать GraphQL API с Mocha, необходимо настроить окружение. Для этого потребуется несколько библиотек:
npm install mocha chai supertest graphql --save-dev
После установки библиотек можно перейти к написанию тестов.
В Mocha тесты обычно разделяются на describe и it блоки:
Вот пример структуры для тестирования GraphQL API:
const request = require('supertest');
const { expect } = require('chai');
describe('GraphQL API', () => {
let server;
before(() => {
// Инициализация сервера перед запуском тестов
server = require('../app'); // Путь к серверу
});
after(() => {
// Закрытие соединений после завершения тестов
server.close();
});
describe('Query Users', () => {
it('should return a list of users', async () => {
const query = `
query {
users {
id
name
email
}
}
`;
const response = await request(server)
.post('/graphql')
.send({ query })
.expect(200);
expect(response.body.data.users).to.be.an('array');
expect(response.body.data.users[0]).to.have.property('id');
expect(response.body.data.users[0]).to.have.property('name');
expect(response.body.data.users[0]).to.have.property('email');
});
});
});
Запросы (queries) и мутации (mutations) являются основными операциями в GraphQL. В Mocha можно легко тестировать оба типа операций. Рассмотрим, как это делается на примере запросов и мутаций.
Запрос в GraphQL позволяет извлечь данные. В примере выше был тест на получение списка пользователей через запрос users.
Пример теста для запроса:
const query = `
query {
users {
id
name
email
}
}
`;
В запросе указываются поля, которые необходимо вернуть. В ответе должны быть получены эти поля в правильной структуре.
Мутации используются для изменения данных, таких как создание, обновление или удаление сущностей. Пример теста для мутации:
describe('Mutation Create User', () => {
it('should create a new user', async () => {
const mutation = `
mutation {
createUser(name: "John Doe", email: "john.doe@example.com") {
id
name
email
}
}
`;
const response = await request(server)
.post('/graphql')
.send({ query: mutation })
.expect(200);
expect(response.body.data.createUser).to.have.property('id');
expect(response.body.data.createUser.name).to.equal('John Doe');
expect(response.body.data.createUser.email).to.equal('john.doe@example.com');
});
});
Здесь проверяется, что после выполнения мутации
createUser возвращаются правильные данные, включая
id, name и email.
В GraphQL можно использовать переменные для динамической передачи данных в запросы и мутации. Это удобно для повторного использования одного и того же запроса с различными параметрами.
Пример использования переменных:
describe('Query User by ID', () => {
it('should return a user by ID', async () => {
const query = `
query($id: ID!) {
user(id: $id) {
id
name
email
}
}
`;
const variables = { id: 1 };
const response = await request(server)
.post('/graphql')
.send({ query, variables })
.expect(200);
expect(response.body.data.user).to.have.property('id').that.equals('1');
expect(response.body.data.user).to.have.property('name');
expect(response.body.data.user).to.have.property('email');
});
});
В данном примере переменная $id используется для передачи значения в запрос, позволяя гибко тестировать API с различными параметрами.
Тестирование ошибок является важной частью процесса разработки. GraphQL сервер должен возвращать информативные ошибки, если что-то пошло не так. Для этого можно создавать тесты, которые проверяют, как сервер обрабатывает некорректные запросы.
Пример теста на ошибку:
describe('Invalid Query', () => {
it('should return an error for invalid query', async () => {
const query = `
query {
invalidField {
id
name
}
}
`;
const response = await request(server)
.post('/graphql')
.send({ query })
.expect(400);
expect(response.body.errors).to.be.an('array');
expect(response.body.errors[0].message).to.include('Cannot query field "invalidField"');
});
});
Здесь проверяется, что сервер корректно обрабатывает запрос с несуществующим полем invalidField и возвращает ошибку.
GraphQL API может требовать авторизации для выполнения некоторых операций. Для тестирования таких случаев можно использовать заголовки, чтобы имитировать авторизацию.
Пример теста с авторизацией:
describe('Authenticated Query', () => {
it('should return user data when authenticated', async () => {
const query = `
query {
me {
id
name
}
}
`;
const token = 'Bearer <valid_token>'; // Здесь должен быть реальный токен
const response = await request(server)
.post('/graphql')
.set('Authorization', token)
.send({ query })
.expect(200);
expect(response.body.data.me).to.have.property('id');
expect(response.body.data.me).to.have.property('name');
});
});
Здесь запрос выполняется с авторизационным токеном, и проверяется, что данные возвращаются только при наличии правильной авторизации.
--parallel, что ускоряет процесс тестирования при большом
количестве тестов.Тестирование GraphQL API с Mocha помогает гарантировать, что все запросы, мутации и взаимодействия с сервером работают корректно, обеспечивая стабильность и предсказуемость работы приложения.