Se você completou o tutorial Jest + Supertest para teste de API GraphQL — Parte 2: Criando a Primeira Spec agora chegou a hora de abstrairmos a função do request para um método só dele e assim não precisarmos mais gerar duplicidade de código.
No tutorial passado nosso código ficou assim:
const request = require("supertest");
var chai = require("chai"),
expect = chai.expect;
describe('Criando a nova primeira spec', () => {
var response = null
test('Vamos criar a primeira request ', async () => {
response = await request("https://api.geographql.rudio.dev")
.post("/graphql")
.send({
query: `query states($filter: StateFilterInput, $pagination: PaginationInput) {
states(filter: $filter, page: $pagination) {
totalCount
edges {
cursor
node {
name
state_code
country_code
latitude
longitude
}
}
pageInfo {
hasNextPage
hasPreviousPage
endCursor
startCursor
}
}
}`,
variables: {
filter: {
ciso2: "US",
},
pagination: {
first: 5,
},
},
})
.expect("Content-Type", "application/json; charset=utf-8")
.expect(200);
console.log(JSON.stringify(response.body))
});
});
Tudo dentro da nossa classe de teste, porém isso não é nem um pouco performatico ou com boas práticas de código. Mas para um primeiro momento e entendimento dos conceitos ele é necessário. Mas vamos arregaçar as mangas e começar.
Passo 1: Vamos criar a nossa pasta helpers e criar a “carcaça” do nosso request
Está pasta irá conter todos os códigos que irão nos auxiliar durante os testes, inclusive o nosso request.js.

Dentro da pasta helpers criada iremos criar uma nova pasta chamada utils porque iremos adicionar a ela todos os utilitários do nosso teste. Criada as pastas agora vamos criar os arquivos.
Na raiz da pasta helpers precisamos criar o arquivo index.js ele irá indexar todas os métodos criados e deixando eles assim disponiveis para o nosso projeto todo visualizar e utilizar.
Dentro deste arquivo index.js iremos exportar a nossa pasta criada, deixando claro para todo o nosso projeto que tem uma pasta utils que pode ser vista e utilizada.
export * from "./utils";
Agora dentro da nossa pasta utils também precisamos criar um arquivo index.js para mostrar para o projeto que além de visualizar a pasta eles podem visualizar e utilizar os arquivos que estão dentro delas.
export * from "./request";
Mas você deve estar se pergutando: “Mas Pri! Eu não tenho este arquivo dentro da minha pasta utils”. E sim você está certo, por isso iremos criar ele agora e começar a “jogar” nosso código para dentro dele.
Crie o arquivo request.js e deixe ele dentro da pasta utils, dentro dele iremos adicionar todo o código da nossa spec relacionado ao request. As importações como supertest e as bibliotecas de asserções dos testes.
const request = require("supertest");
var chai = require("chai"),
expect = chai.expect;
Agora iremos precisar criar um método que irá executar a ação do request.
- O comando export async function informa que está sendo criada uma função asyncrona que será exportada e assim visivel em nosso projeto.
- o nosso método foi chamado de requestGraphqlTutorial ele irá receber 2 parâmetros a baseURL (url a ser utilizada) e o payload (query e variables)
const request = require("supertest");
var chai = require("chai"),
expect = chai.expect;
export async function requestGraphqlTutorial(baseURL, payload) {
const response = await request(baseURL)
.post("/graphql")
.send(payload)
.expect("Content-Type", "application/json; charset=utf-8")
.expect(200);
return response;
}
Parte 1, foi finalizada. Agora vamos melhorar a nossa spec.
Parte 2: Evoluindo a nossa Spec
Primeira coisa que precisamos fazer agora é dizer para a nossa spec que criamos uma função chamada requestGraphql e que ela será utilizada no nosso código, para isso adicione o comando abaixo.
import { requestGraphqlTutorial} from "../../helpers/utils/request";
Depois de importar precisamos criar algumas declarações, e a primeira delas será a variavel payload que vai receber a query e a variable que será enviada.
E a variável baseURL, informando a url do nosso teste.
import { requestGraphqlTutorial} from "../../helpers/utils/request";
describe('Criando a nova primeira spec', () => {
var response = null
var payload = {
query: `query states($filter: StateFilterInput, $pagination: PaginationInput) {
states(filter: $filter, page: $pagination) {
totalCount
edges {
cursor
node {
name
state_code
country_code
latitude
longitude
}
}
pageInfo {
hasNextPage
hasPreviousPage
endCursor
startCursor
}
}
}`,
variables: {
filter: {
ciso2: "US",
},
pagination: {
first: 5,
},
}
}
var baseURL = "https://api.geographql.rudio.dev";
});
Agora iremos substituir o nosso bloco de código “chumbado” pelo nosso método criado.
import { requestGraphql } from "../../helpers/utils/request";
describe('Criando a nova primeira spec', () => {
var response = null
var payload = {
query: `query states($filter: StateFilterInput, $pagination: PaginationInput) {
states(filter: $filter, page: $pagination) {
totalCount
edges {
cursor
node {
name
state_code
country_code
latitude
longitude
}
}
pageInfo {
hasNextPage
hasPreviousPage
endCursor
startCursor
}
}
}`,
variables: {
filter: {
ciso2: "US",
},
pagination: {
first: 5,
},
}
}
var baseURL = "https://api.geographql.rudio.dev";
test('Vamos criar a primeira request ', async() => {
response = await requestGraphqlTutorial(baseURL, payload)
console.log(JSON.stringify(response.body))
});
});
Agora vocês rodando o teste, vocês irão ver o mesmo resultado de sucesso anterior, porém agora você possui uma função “generica” de request que pode utilizar nos seus outros testes, passando apenas a url e o payload de envio que ela irá fazer todo o trabalho por você.
Agora de uma olhadinha no comparativo de antes e depois do código. Olha a quantidade de código que foi diminuida da nossa classe de teste.

E se você quer ver como o repositório final se encontra só acessar o meu portfolio no Github https://github.com/pricaimiTech/geographqlJestAPI
E não esqueça de me seguir nas minhas redes sociais https://linktr.ee/priscilacaimi
Deixe um comentário