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()呼び出しをスキップ(モック)するだけです。

回答

3 Noname Nov 25 2020 at 16:48

モンキーパッチを使用して関数をモックすることができます。これが役立つ場合の例です。

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)

2番目のアサーションを実行する前にわかるように、db_entry関数の値をモックしてfalseを返します。必要に応じて、モンキーパッチを使用して関数をモックし、何も返さないようにすることができます。lambda: None

db_entry関数が何をするのかわかりませんが、dbクエリを実行し、結果のリストを返していると言います。 lambda: ["foobar"]