Como simular a chamada de função dentro de outra função 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
    


Eu tenho chamada de função db_entry () em publish_book (). como podemos simular a chamada de função db_entry () dentro de publish_book. Eu quero realizar outros cálculos de publish_book (), mas apenas pular (simular) a chamada db_entry ().

Respostas

3 Noname Nov 25 2020 at 16:48

Você pode usar o monkeypatch para simular funções. Aqui está um exemplo se isso te ajudar.

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 você pode ver, antes de fazer a segunda afirmação, estou zombando do valor da db_entryfunção para retornar falso. Você pode usar o monkeypatch para simular a função para não retornar nada se quiser usando lambda comolambda: None

Não tenho certeza do que sua função db_entry faz, mas digo que ela está fazendo alguma consulta db e retornando uma lista de resultados que você pode simular também usando lambda retornando lambda: ["foobar"]