dev-resources.site
for different kinds of informations.
Mockando Constantes em Testes com Jest: Um Exemplo Prático
Ao trabalhar com constantes em seus projetos, às vezes é necessário alterar seus valores para testar diferentes cenários. Porém, constantes importadas diretamente não podem ser sobrescritas facilmente, o que pode dificultar a criação de testes. Neste artigo, veremos como usar o Jest para mockar constantes de forma dinâmica, garantindo testes isolados e confiáveis.
Vamos criar um exemplo fictício chamado adjustImageQuality
, onde ajustamos a qualidade de uma imagem dependendo se estamos em um ambiente de produção.
Implementação
Arquivo constants.js
Definimos uma constante chamada IS_PRODUCTION
que indica se estamos em um ambiente de produção:
// constants.js
export const IS_PRODUCTION = false;
Arquivo adjustImageQuality.js
Agora, criamos a função adjustImageQuality
. Ela altera a qualidade da imagem apenas se o sistema estiver em produção:
// adjustImageQuality.js
import { IS_PRODUCTION } from "./constants";
export default function adjustImageQuality(img) {
if (IS_PRODUCTION) {
img.quality = 100; // Qualidade máxima em produção
} else {
img.quality = 50; // Qualidade reduzida em desenvolvimento
}
return img;
}
Escrevendo os Testes
Queremos testar o comportamento de adjustImageQuality
para os dois cenários: produção (IS_PRODUCTION = true
) e desenvolvimento (IS_PRODUCTION = false
).
Arquivo adjustImageQuality.test.js
Utilizamos o Jest para mockar o valor de IS_PRODUCTION
dinamicamente. O segredo é usar jest.mock
e sobrescrever a constante com um getter personalizado.
// adjustImageQuality.test.js
import adjustImageQuality from "./adjustImageQuality";
// Mock para a constante IS_PRODUCTION
const mockIsProduction = jest.fn();
jest.mock("./constants", () => {
const constants = jest.requireActual("./constants");
return {
...constants,
get IS_PRODUCTION() {
return mockIsProduction();
},
};
});
beforeEach(() => {
mockIsProduction.mockClear(); // Limpa os mocks antes de cada teste
});
test("sets image quality to 100 in production", () => {
// Configura o mock para retornar true (produção)
mockIsProduction.mockReturnValue(true);
const img = { quality: 0 };
const result = adjustImageQuality(img);
expect(result.quality).toEqual(100);
});
test("sets image quality to 50 in development", () => {
// Configura o mock para retornar false (desenvolvimento)
mockIsProduction.mockReturnValue(false);
const img = { quality: 0 };
const result = adjustImageQuality(img);
expect(result.quality).toEqual(50);
});
Explicação do Mock
1. Criando o Mock
Utilizamos o jest.mock
para interceptar o módulo constants
. Dentro dele, usamos o jest.requireActual
para obter as exportações reais e adicionamos um getter
para a constante IS_PRODUCTION
.
jest.mock("./constants", () => {
const constants = jest.requireActual("./constants");
return {
...constants,
get IS_PRODUCTION() {
return mockIsProduction();
},
};
});
2. Mockando o Valor de IS_PRODUCTION
Dentro de cada teste, usamos mockReturnValue
para simular diferentes valores para IS_PRODUCTION
:
-
mockIsProduction.mockReturnValue(true)
para produção. -
mockIsProduction.mockReturnValue(false)
para desenvolvimento.
3. Limpeza com mockClear
Antes de cada teste, limpamos o estado do mock para garantir que ele não interfira nos outros testes:
beforeEach(() => {
mockIsProduction.mockClear();
});
Conclusão
Este padrão de mock para constantes permite que você controle dinamicamente valores usados na lógica de sua aplicação, garantindo testes isolados e confiáveis. Ele é especialmente útil quando você precisa testar comportamentos baseados em variáveis globais, configurações ou estados do sistema.
Com essa abordagem, você consegue cobrir cenários complexos sem comprometer a estrutura do seu código ou adicionar dependências externas desnecessárias.
Featured ones: