Wie verspottet man einen Funktionsaufruf innerhalb einer anderen Funktion mit 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
Ich habe den Funktionsaufruf db_entry () in Publish_book (). Wie können wir den Funktionsaufruf db_entry () in Publish_book verspotten? Ich möchte andere Berechnungen von Publish_book () durchführen, aber nur den Aufruf von db_entry () überspringen (verspotten).
Antworten
Sie können Monkeypatch verwenden , um Funktionen zu verspotten. Hier ist ein Beispiel, wenn es Ihnen hilft.
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)
Wie Sie sehen können, bevor Sie die zweite Behauptung aufstellen, verspotte ich den Wert der db_entry
Funktion, um false zurückzugeben. Sie können monkeypatch verwenden, um die Funktion zu verspotten und nichts zurückzugeben, wenn Sie möchten, indem Sie Lambda wie verwendenlambda: None
Ich bin nicht sicher, was Ihre Funktion db_entry tut, aber sagen Sie, dass sie eine Datenbankabfrage durchführt und eine Liste von Ergebnissen zurückgibt, die Sie verspotten können, indem Sie Lambda verwenden, indem Sie zurückgeben lambda: ["foobar"]