wkwk_soprano’s blog

wkwkのメモです

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_hogeHogeクラスのsum_hogeメソッドをモックしている関数   
mockerを使う方法もあるようだが、違いはよくわかっていない
ひとまずはmonkeypatchでしのげるためこれでいく