pytestでmonkeypatchを使う
(旧ブログからの移行記事です)
pytestでテストしたいクラスの一部メソッドをモック化したいときにmonkeypatchをつかう。この記事はそのメモ。
-- 例えば以下のようなクラスのテストをすることを想定する。
class Hoge: x = 10 y = 20 def sum_hoge(self): return self.x + self.y def sum_power(self): sum_x_y = self.sum_hoge() return pow(sum_x_y,2)
sum_hoge
をテストするときに、sum_hoge
内で参照しているクラス変数xを変えても確からしい結果(ここでは「変更後のx+yの値」になること)になるか確かめたい
このときmonkeypatchを使うと以下のようにテストできる
import Hoge # ここはディレクトリ構成等に合わせて変える def test_sum_hoge_success(monkeypatch): hoge = Hoge() monkeypatch.setattr(hoge, "x", 20) expected_result = 40 actual_result = hoge.sum_hoge() assert expected_result == actual_result
monkeypatchは組み込み関数なので新たにimportする必要はない。
次にsum_power
をテストする
このメソッドの中ではsum_hoge
を使っているので、sum_hoge
メソッドをモックしてsum_power
をテストする
import Hoge # ここはディレクトリ構成等に合わせて変える def test_sum_power_success(monkeypatch): def mock_sum_hoge(): return 50 hoge = Hoge() monkeypatch.setattr(hoge, "sum_hoge", mock_sum_hoge) expected_result = 2500 actual_result = hoge.sum_power() assert expected_result == actual_result
mock_sum_hoge
はHoge
クラスのsum_hoge
メソッドをモックしている関数
mockerを使う方法もあるようだが、違いはよくわかっていない
ひとまずはmonkeypatchでしのげるためこれでいく