Wie verspottet man einen Funktionsaufruf innerhalb einer anderen Funktion mit pytest?

Nov 25 2020
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

3 Noname Nov 25 2020 at 16:48

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_entryFunktion, 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"]