このページを正しく表示するにはJavascriptを有効にしてください。
Pythonの万能モック MagicMockと戯れる
## 導入
Python3.3以降なら標準で利用できます。それ未満の場合は ```pip install mock```してインストールをします。
## 準備: MacigMockを作る
```python
from unittest.mock import MagicMock
# Python3.3未満の場合はこっち
from mock import MagicMock
# MagicMockインスタンス作成
m = MagicMock()
```
## いろいろ生やす
```python
# 好きに生やせる
m.hoge = 123
# チェーンする場合も一気に生やせる
m.fuga.piyo = "abc"
# 辞書もいける
m["spam"]["ham"] = "egg"
# こんなのも
m.a["b"].c["d"] = "e"
```
## いろいろ呼ぶ
```python
# 勝手に生やしたものを関数として呼び出すことも可能
# 呼び出すとMagicMockが返る
m.hogehoge()
#=>
# 返り値をカスタマイズ
m.hogehoge.return_value = "Hello"
m.hogehoge()
#=> 'Hello'
# 任意の引数付きでも呼べる
m.fugafuga(1,2,3, test="test")
#=>
# どんな引数で呼ばれたかを調べる
args, kwargs = m.fugafuga.call_args
args
#=> (1, 2, 3)
kwargs
#=> {'test': 'test'}
```
## 演算
```python
# こんなことしても怒られない
m + 3
#=>
# 逆パターン
3 + m
#=>
# MagicMockが返ってきてるので、
# メソッドと同じように演算結果を書き換えてみる
m.__add__.return_value = 10
m.__add__.return_value = 8
# 確認
m + 3
#=> 10
3 + m
#=> 8
```
## 引数に応じて返り値を変える
```python
# デフォルト
m.add(3, 5)
#=>
# 処理を定義
def add(x, y):
return x + y
# m.addの挙動を指定
m.add.side_effect = add
# 上書き完了
m.add(3, 5)
#=> 8
# こうも書ける
m.add.side_effect = lambda x, y: x+y
# こうやると1つの引数をそのまま返すので便利かも
m.xx.side_effect = lambda x: x
m.xx(1234)
#=> 1234
```
## スライス
```python
# これでもエラーにならない
m.array[0:3]
#=>
# ふむ
m.array.__getitem__.side_effect = lambda x: [i for i in range(x.start, x.stop)]
m.array[4, 7]
#=> [4, 5, 6]
```
## (WIP)
遊びつつまた後日追記してきます。