Objetos Mock e Fixtures em Testes TypeScript: Do Iniciante ao Profissional

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que testes sem mocks são como café sem cafeína?

\n\n

Imagine: você está escrevendo uma aplicação em TypeScript que envia e-mail, se comunica com um banco de dados e acessa uma API externa. Você executa os testes — e de repente tudo falha porque o servidor de e-mail está temporariamente indisponível. Familiar?

\n\n

É aqui que entram em cena os objetos mock (simuladores) e as fixtures (dados de teste). Eles permitem isolar o código do mundo externo e tornar os testes rápidos, confiáveis e previsíveis. Neste artigo em português, vamos analisar com exemplos reais como usar corretamente o mock em TypeScript, quais são os tipos de fixtures para TypeScript e como não cometer erros.

\n\n

O artigo foi escrito para o PythonLib — um portal educacional onde ensinamos a escrever código de qualidade. Vamos nessa!

\n\n

O que são objetos mock e fixtures?

\n\n

Objetos Mock: atores dublês no seu código

\n\n

Objeto mock (ou simplesmente mock) é uma substituição de um objeto real que imita seu comportamento. Você diz: "Quando o método sendEmail() for chamado, retorne true". E o teste não acessa o e-mail real.

\n\n

Em TypeScript, os mocks geralmente são criados com as bibliotecas Jest ou Vitest. Elas permitem verificar se o método foi chamado, com quais argumentos e quantas vezes.

\n\n

Fixtures: dados preparados para testes

\n\n

Fixtures são conjuntos de dados pré-preparados. Por exemplo, um objeto de usuário, uma lista de pedidos ou uma configuração de aplicação. Em vez de criá-los manualmente toda vez, você armazena as fixtures em arquivos separados.

\n\n

A combinação de mock + fixture é o padrão de testes TypeScript em 2024.

\n\n

Prática: escrevendo testes com mocks e fixtures

\n\n

Configuração do ambiente

\n\n

Para os exemplos, usaremos o Jest (embora tudo funcione da mesma forma no Vitest). Certifique-se de ter as dependências instaladas:

\n\n
npm install --save-dev jest @types/jest ts-jest
\n\n

Adicione no jest.config.js:

\n\n
module.exports = {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n};
\n\n

Exemplo 1: Mock do serviço de envio de e-mail

\n\n

Suponha que temos um serviço de notificações:

\n\n
// notificationService.ts\nexport class EmailService {\n  async sendEmail(to: string, subject: string, body: string): Promise<boolean> {\n    // Envio real — não vamos mexer nisso\n    return true;\n  }\n}\n\nexport class NotificationManager {\n  constructor(private emailService: EmailService) {}\n\n  async notifyUser(email: string, message: string): Promise<string> {\n    const result = await this.emailService.sendEmail(email, 'Notificação', message);\n    return result ? 'Enviado' : 'Erro';\n  }\n}
\n\n

Agora vamos escrever um teste com objeto mock:

\n\n
// notificationService.test.ts\nimport { NotificationManager, EmailService } from './notificationService';\n\ndescribe('NotificationManager', () => {\n  it('deve enviar a notificação e retornar "Enviado"', async () => {\n    // Criando o mock\n    const mockEmailService: jest.Mocked<EmailService> = {\n      sendEmail: jest.fn().mockResolvedValue(true),\n    };\n\n    const manager = new NotificationManager(mockEmailService);\n    const result = await manager.notifyUser('test@test.com', 'Olá!');\n\n    expect(result).toBe('Enviado');\n    expect(mockEmailService.sendEmail).toHaveBeenCalledWith(\n      'test@test.com',\n      'Notificação',\n      'Olá!'\n    );\n  });\n\n  it('deve retornar "Erro" se o envio falhar', async () => {\n    const mockEmailService: jest.Mocked<EmailService> = {\n      sendEmail: jest.fn().mockResolvedValue(false),\n    };\n\n    const manager = new NotificationManager(mockEmailService);                

Blogs

Book Recommendations