¿Cómo simular la llamada a la función dentro de otra función usando 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
    


Tengo una llamada a la función db_entry () en publish_book (). ¿Cómo podemos simular la llamada a la función db_entry () dentro de publish_book? Quiero realizar otros cálculos de publish_book (), pero solo omitir (simular) la llamada db_entry ().

Respuestas

3 Noname Nov 25 2020 at 16:48

Puede usar monkeypatch para simular funciones. Aquí tienes un ejemplo si te ayuda.

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)

Como puede ver, antes de hacer la segunda afirmación, me burlo del valor de la db_entryfunción para devolver falso. Puede usar monkeypatch para burlarse de la función para no devolver nada si lo desea usando lambda comolambda: None

No estoy seguro de lo que hace su función db_entry, pero digo que está haciendo una consulta de db y devolviendo una lista de resultados que puede burlarse de eso también usando lambda devolviendo lambda: ["foobar"]