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
    


publish_book ()에 db_entry () 함수 호출이 있습니다. publish_book 내부에서 db_entry () 함수 호출을 어떻게 모의 할 수 있습니까? publish_book ()의 ​​다른 계산을 수행하고 싶지만 db_entry () 호출 만 건너 뛰 (mock)합니다.

답변

3 Noname Nov 25 2020 at 16:48

monkeypatch 를 사용 하여 함수를 모의 할 수 있습니다 . 도움이된다면 여기에 예가 있습니다.

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)

두 번째 주장을 수행하기 전에 볼 수 있듯이 db_entry함수 값을 조롱하여 false를 반환합니다. 람다를 사용하여 원하는 경우 monkeypatch를 사용하여 함수를 모의하여 아무것도 반환하지 않을 수 있습니다.lambda: None

나는 당신의 db_entry 함수가 무엇을하는지 잘 모르겠지만 일부 db 쿼리를 수행하고 결과 목록을 반환한다고 말하면서 반환하여 람다를 사용하여 조롱 할 수 있습니다. lambda: ["foobar"]