Comment simuler un appel de fonction dans une autre fonction à l'aide de 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
    


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

3 Noname Nov 25 2020 at 16:48

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_entryfunction 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"]