Comment simuler un appel de fonction dans une autre fonction à l'aide de 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
J'ai un appel de fonction db_entry () dans publish_book (). Comment pouvons-nous nous moquer de l'appel de la fonction db_entry () à l'intérieur de publish_book.
Réponses
Vous pouvez utiliser monkeypatch pour simuler des fonctions. Voici un exemple si cela vous aide.
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)
Comme vous pouvez le voir avant de faire la deuxième assertion, je me moque de la valeur de db_entry
function pour retourner false. Vous pouvez utiliser monkeypatch pour simuler la fonction pour ne rien renvoyer si vous le souhaitez en utilisant lambda commelambda: None
Je ne suis pas sûr de ce que fait votre fonction db_entry mais dis qu'elle fait une requête db et renvoie une liste de résultats, vous pouvez également vous en moquer en utilisant lambda en retournant lambda: ["foobar"]