Python mock side_effect

Python学習【365日チャレンジ!】199日目のマスターU(@Udemy11)です。

突然のゲリラ雨でビシャビシャになってしまいました。

快晴だったので、ちょっと足を伸ばして散歩に行ったら急に雲行きが怪しくなってきて、やばいな〜と思っていたら、案の定ボツボツ降ってきたと思ったらあっという間に土砂降りになっていました。

普段ならきちんとWeatherNewsで雨雲レーダーを確認してから出かけるのですが、たまたまチェックするのを忘れていたんですよね。

最近は、晴れてたとしてもあっという間に天気が崩れたりするので、出かける前に天候チェックは必須ですね。

それでは、今日もPython学習をはじめましょう。

昨日の復習

昨日は、デコレーターを使わずにmock.patchでテストする方法を学習しました。

withステートメントを使う方法と、patcherを使う方法がありましたが、setupteardownと組み合わせて使うのが一般的な使い方でした。

デコレーターを使わないmock.patchのテストの詳細は、こちらの記事をごらんください。

今日は、関数を使って疑似値を返せるside_effectを学習します。

side_effectの使い方

テストするメインのファイルは昨日までと同じsalary.pyです。

昨日はpatcherを使ってreturn_valueに値を渡していましたが、side_effectを使えば関数の返り値を渡すことができます。

import unittest
from unittest import mock

import salary


class TestSalary(unittest.TestCase):
    def setUp(self):
        self.patcher = mock.patch('salary.BonusApi.bonus_price')
        self.mock_bonus = self.patcher.start()

    def tearDown(self):
        self.patcher.stop()

    def test_cal_salary_patch_side_effect(self):
        def f(year):
            return year * 2

        self.mock_bonus.side_effect = f

        s = salary.Salary(year=2020)
        salary_price = s.cal_salary()

        self.assertEqual(salary_price, 4090)
        mock_bonus.assert_called()

16行目、17行目で代入する値を関数にして、19行目はreturn_valueだったのをside_effectに変更して、関数を代入しています。

24行目の値は、ベース給料の50とyear * 2の4040を足した4090にしています。

lamdaでも大丈夫

簡単な関数であればlambdaで代用することも可能です。

        self.mock_bonus.side_effect = lambda year: year * 2

16行目から19行目までを上記のコードに変えることができます。

lambdaの使い方については、こちらの記事を参考にしてください。

最初の頃に学習したlambdaですが、すでに忘れかけているかもしれないので、この機会に思い出しておきましょう。

習慣化は難しい?

今日でPython学習を継続して199日になりましたが、感覚的にはまだまだ習慣化できているとはいえないような感じがしています。

というのも、習慣化って無意識にできるようになるってことだと思っているので、まだそこまでのレベルには達していません。

意識して、記事を書こうと思わないとサボってしまう勢いがあるので、気持ちを引き締めて、明日からもPython学習を継続していきたいと思います。

それでは、明日もGood Python!