Photo by Unsplash

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

1
# demo_file.py
2
ENVS = { 'real_value': True, 'another_real_value': False }
3
4
# test_your_demo_file.py
5
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).
1
# demo_file.py
2
import os
3
4
ENVS = { 'real_value': os.environ('REAL_VALUE'), 'another_real_value': os.environ('ANOTHER_REAL_VALUE') }
5
6
def simple_method():
7
print(ENVS)
8
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.
1
# test_my_envs.py
2
from demo_file import simple_method
3
4
@mocker.patch("demo_file.ENVS", new={'MOCKED_REAL_VALUE': None, 'MOCKED_ANOTHER_REAL_VALUE': ''})
5
def test_if_simple_method_is_working():
6
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

Blog

Testing en Python: Hacer mock de una variable global

Blog

Faire un mock pour une variable globale dans les tests de Python

Blog

Mocking global variables in Python tests

Autor

Escrito por Helmer Davila