¿Cómo simular la llamada a la función dentro de otra función usando pytest?
def publish_book(publisher):
# some calculations
factor = 4
print('xyz')
db_entry(factor) # db entry call which I want to mock
print('abc')
def update():
publish_book('xyz')
@pytest.mark.django_db
def test_update(mocker):
# in here I'm unable to mock nested function call
pass
Tengo una llamada a la función db_entry () en publish_book (). ¿Cómo podemos simular la llamada a la función db_entry () dentro de publish_book? Quiero realizar otros cálculos de publish_book (), pero solo omitir (simular) la llamada db_entry ().
Respuestas
Puede usar monkeypatch para simular funciones. Aquí tienes un ejemplo si te ayuda.
def db_entry():
return True
def add_num(x, y):
return x + y
def get_status(x, y):
if add_num(x, y) > 5 and db_entry() is True:
return True
else:
return False
def test_get_stats(monkeypatch):
assert get_status(3, 3)
monkeypatch.setattr("pytest_fun.db_entry", lambda: False)
assert not get_status(3, 3)
Como puede ver, antes de hacer la segunda afirmación, me burlo del valor de la db_entryfunción para devolver falso. Puede usar monkeypatch para burlarse de la función para no devolver nada si lo desea usando lambda comolambda: None
No estoy seguro de lo que hace su función db_entry, pero digo que está haciendo una consulta de db y devolviendo una lista de resultados que puede burlarse de eso también usando lambda devolviendo lambda: ["foobar"]