Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 75 – API JavaScript, Node.js e Express – Mocking – jest.mock(), nock para HTTP

Imagem destacada da aula de API

Introdução (3 min)

Imagine um dublê de cinema. Ele substitui o ator em cenas perigosas, simulando a realidade sem os riscos. No desenvolvimento de software, o mocking faz o mesmo: simula componentes externos, como APIs e bancos de dados, permitindo testes isolados e previsíveis. Esta prática é estratégica para APIs modernas, garantindo a qualidade do código e acelerando o desenvolvimento. Nesta aula, vamos construir um exemplo prático de mocking com jest.mock() e nock, focando em requisições HTTP em um ambiente Node.js/Express.

Conceito Fundamental (7 min)

Mocking, em termos técnicos, é a substituição de um componente real por uma versão simulada que imita seu comportamento. Isso isola o código em teste, removendo dependências externas e garantindo resultados consistentes. Imagine testar uma função que depende de uma API de previsão do tempo. Usar a API real tornaria o teste imprevisível, pois o clima muda. Com mocking, simulamos a resposta da API, controlando o resultado do teste. Este conceito se integra com frameworks de teste como Jest e bibliotecas como Nock.

    • Casos de uso: Testes unitários e de integração, desenvolvimento com APIs externas indisponíveis, simulação de diferentes cenários de resposta.
    • Vantagens: Testes mais rápidos, confiáveis e isolados; desenvolvimento independente de serviços externos.
    • Desvantagens: Pode criar uma falsa sensação de segurança se o mock não representar fielmente o componente real; exige manutenção dos mocks.

Implementação Prática (10 min)

Vamos implementar um exemplo que busca dados de um usuário de uma API externa e os exibe. Usaremos nock para simular a requisição HTTP e jest.mock() para simular um módulo interno.

// users.js
const axios = require('axios');

const getUser = async (id) => { try { const response = await axios.get(https://jsonplaceholder.typicode.com/users/${id}); return response.data; } catch (error) { console.error('Erro ao buscar usuário:', error); // Logging robusto throw error; // Repropagando o erro para tratamento externo } };

module.exports = { getUser };

// users.test.js
const axios = require('axios');
const { getUser } = require('./users');
const nock = require('nock');

jest.mock('axios'); // Mock do módulo axios

describe('getUser', () => { it('deve retornar os dados do usuário com sucesso', async () => { const userData = { id: 1, name: 'Leanne Graham' }; nock('https://jsonplaceholder.typicode.com') // Simula a requisição HTTP .get('/users/1') .reply(200, userData);

axios.get.mockResolvedValue({ data: userData }); // Define o retorno do mock do axios

const user = await getUser(1); expect(user).toEqual(userData); });

it('deve lidar com erros da API', async () => { nock('https://jsonplaceholder.typicode.com') .get('/users/2') .reply(500, 'Erro interno do servidor');

axios.get.mockRejectedValue(new Error('Erro interno do servidor')); // Simula rejeição

await expect(getUser(2)).rejects.toThrow('Erro interno do servidor'); }); });


Instalação das dependências (uma única vez)

📚 Informações da Aula

Curso: API Completo - Node.js & Express

Tempo estimado: 25 minutos

Pré-requisitos: JavaScript básico

npm install axios jest nock

Execução dos testes

npm test

Adaptações para HostGator Plano M seriam referentes à configuração do ambiente Node.js e gerenciamento de dependências, que são similares a qualquer outro ambiente Linux. Assegure-se de ter Node.js e npm instalados e configurados corretamente.

Exercício Hands-On (5 min)

Modifique o código para buscar um post do usuário (endpoint /posts) usando o mesmo ID do usuário. Simule a resposta da API com nock e teste o novo comportamento.

Solução:

Adicione uma nova função getUserPost(userId) que utilize axios.get() para acessar o endpoint /posts com o userId fornecido. Em seguida, crie um novo teste que simule a resposta deste endpoint com nock e verifique se o resultado é o esperado. Certifique-se de lidar com possíveis erros. A lógica de mocking e tratamento de erros permanece a mesma.

Próximos passos: Explore outras bibliotecas de mocking como sinon.js e aprofunde-se nos recursos avançados do Jest para testes mais complexos.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas