Fazer mocks de variáveis globais em testes Python

Fazer mocks de variáveis globais em testes Python

Estava tentando testar algumas variáveis globais com Python, especialmente para um script que contém variáveis globais. E depois de tentar e falhar, acho que posso mostrar a versão mais simples para fazê-lo.

🏃 A solução rápida

demo_file.py
ENVS = { 'real_value': True, 'another_real_value': False }

E agora em seu arquivo de teste, você pode fazer o seguinte.

test_your_demo_file.py
mocker.patch("demo_file.ENVS", new={'MOCKED_NONE': None, 'MOCKED_EMPTY': ''})

Depois disso, em seu arquivo demo_file, a variável ENVS seria mocks.

✏️ Solução com descrição

Requisitos

Para simplicidade do trabalho. Eu recomendo a seguinte biblioteca: https://pypi.org/project/pytest-mock/

Que eu estava tentando fazer?

Primeiro, vamos supor que você tenha um arquivo chamado demo_file.py com o seguinte conteúdo (e onde a variável global está localizada).

demo_file.py
import os
ENVS = { 'real_value': os.environ('REAL_VALUE'), 'another_real_value': os.environ('ANOTHER_REAL_VALUE') }
def simple_method():
print(ENVS)
return 0

Se você tentar executar simple_method, ele imprimirá o dicionário com real_value e another_real_value lá.

Agora temos o seguinte arquivo de teste.

Sei que o teste parece simples, mas está garantindo que pelo menos está retornando um valor zero após imprimir os valores do ENV.

👾 Fazer mock da variável

Mas como você vê, estamos chamando as variáveis de ambiente no computador atual e, se você escrever seus testes esperando tê-los em seu servidor CI/CD, os testes começarão a falhar. Como podemos evitar isso e dizer a nosso servidor de teste (ou pipeline de teste) que queremos valores fixos específicos?

Se você instalou o pacote mencionado acima, na seção de requisitos, é muito fácil começar a fazer mocks de valores. Então, só precisamos adicionar uma única linha.

test_my_envs.py
from demo_file import simple_method
@mocker.patch("demo_file.ENVS", new={'MOCKED_REAL_VALUE': None, 'MOCKED_ANOTHER_REAL_VALUE': ''})
def test_if_simple_method_is_working():
assert simple_method() == 0

E seus testes não executarão a variável ENVS real e, portanto, não chamarão os os.environ.

Meus posts não são geradas por IA, no estanto, elas poderiam ser corrigidas por ela. O primero rascunho é siempre minha criaçao

Tags

Autor

Escrito por Helmer Davila