pytest:モックの処理内容を引数で変える

関数をモックに差し替えるけど、引数の値によっては元々の関数で処理したい、という場合のメモです。

まずは、モックに差し替える関数の例。

def myfunc(cond):
  return f"original: {cond}"

pytest で実行するテストコード。
モックに差し替える前に、元の関数を org_myfunc に保持し、差し替えたモック内で引数を判定して処理を分岐させます。

import mdl
import pytest

def test_myfunc(mocker):
  org_myfunc = mdl.myfunc
  def mock_myfunc(cond):
    if cond:
      return f"mock: {cond}"
    else:
      return org_myfunc(cond)
  mocker.patch("mdl.myfunc", side_effect=mock_myfunc)

  assert mdl.myfunc(True) == "mock: True"
  assert mdl.myfunc(False) == "original: False"

コメント