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