Como simular a chamada de função dentro de outra função 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
Eu tenho chamada de função db_entry () em publish_book (). como podemos simular a chamada de função db_entry () dentro de publish_book. Eu quero realizar outros cálculos de publish_book (), mas apenas pular (simular) a chamada db_entry ().
Respostas
Você pode usar o monkeypatch para simular funções. Aqui está um exemplo se isso te ajudar.
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 você pode ver, antes de fazer a segunda afirmação, estou zombando do valor da db_entry
função para retornar falso. Você pode usar o monkeypatch para simular a função para não retornar nada se quiser usando lambda comolambda: None
Não tenho certeza do que sua função db_entry faz, mas digo que ela está fazendo alguma consulta db e retornando uma lista de resultados que você pode simular também usando lambda retornando lambda: ["foobar"]