Jak mockować wywołanie funkcji wewnątrz innej funkcji przy użyciu 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
    


Mam wywołanie funkcji db_entry () w public_book (). jak możemy mockować wywołanie funkcji db_entry () wewnątrz public_book. Chcę wykonać inne obliczenia z Publishing_book (), ale tylko pominąć (udawać) wywołanie db_entry ().

Odpowiedzi

3 Noname Nov 25 2020 at 16:48

Możesz użyć monkeypatch do mockowania funkcji. Oto przykład, jeśli ci to pomoże.

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)

Jak widać przed wykonaniem drugiej asercji, kpię z wartości db_entryfunkcji, aby zwrócić fałsz. Możesz użyć monkeypatch, aby mockować funkcję, aby nic nie zwracała, jeśli chcesz, używając lambda podobnego dolambda: None

Nie jestem pewien, co robi twoja funkcja db_entry, ale mówię, że wykonuje zapytanie o bazę danych i zwraca listę wyników, które możesz wyszydzić, używając lambdy, zwracając lambda: ["foobar"]