回答編集履歴

2

追記・コメントを受けて「追記 2 」を追加しました。

2019/05/02 23:45

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -123,3 +123,31 @@
123
123
 
124
124
 
125
125
  - [Search · "from unittest.mock import patch" | GitHub](https://github.com/search?q=%22from+unittest.mock+import+patch%22&type=Code)
126
+
127
+
128
+
129
+ ### 追記 2
130
+
131
+
132
+
133
+ 追記・コメントありがとうございます。
134
+
135
+
136
+
137
+ > できれば、メソッドではなくて変数をmock化する方法がしりたいのですが、そういったことはできないのでしょうか?
138
+
139
+ >
140
+
141
+ > インスタンス変数を置き換える方法を探していまして、一応実現できた方法を追記しますので、それよりももう少しマシな方法があればなぁと思っております。
142
+
143
+
144
+
145
+ このご発言から siruku6 さんが「自分が追記したコードではインスタンス変数の置き換えがなされていて、 gh640 のコードではされていない」と考えていらっしゃると私は理解したのですが、この理解は合っていますか?
146
+
147
+
148
+
149
+ もしそうなら、私は違う認識を持っています。私は siruku6 さんが追記されたコードも私が提示したコードも mock 化という意味ではやっていることは同じで「 callable を差し替えて、その戻り値のインスタンスのアトリビュートをダミー値に変えてチェックしている」と思っています。 siruku6 さんのコードでは callable が `abcd.something_api.Requesting` でアトリビュートが `response` 、私が提示したコードでは callable が `requests.get()` でアトリビュートが `content` と、それぞれ名前は違いますが構造的には同じだと私は認識しています。
150
+
151
+
152
+
153
+ いかがでしょうか。もしこの理解 ↑ が間違っているなら、私は siruku6 さんが繰り返し言われている「インスタンス変数の mock 化」が何を意味するのかがわかっていません。「インスタンス変数の mock 化」が、私のコードではされていなくて siruku6 さんのコードではなされている、と考えていらっしゃるかと思うのですが、そこをもう少し詳しくご説明いただけると、何らか追加の説明がさせていただけるかもしれません。

1

コメントを受けて「追記 1 」を追加しました。

2019/05/02 23:45

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -15,3 +15,111 @@
15
15
 
16
16
 
17
17
  実際のコードはもっと mock を使いたくなるようなものになっているのでしょうか。もしそうなら、もう少し実際のものに近いコードをご提示いただいた方がより具体的な回答がもらいやすくなると思います。
18
+
19
+
20
+
21
+ ### 追記 1
22
+
23
+
24
+
25
+ インスタンスアトリビュートではなく、外部 API へのリクエスト処理を mock 化したい、ということですね。
26
+
27
+
28
+
29
+ ひとつだけサンプルをお示ししてみます。
30
+
31
+
32
+
33
+ 次のようなクラス `Client` がある場合を考えてみます。
34
+
35
+
36
+
37
+ `client.py`:
38
+
39
+
40
+
41
+ ```python
42
+
43
+ import requests
44
+
45
+
46
+
47
+ class Client:
48
+
49
+ URL = 'https://example.com/api/posts/'
50
+
51
+
52
+
53
+ def get_hoge(self):
54
+
55
+ response = requests.get(self.URL)
56
+
57
+ return response.content
58
+
59
+ ```
60
+
61
+
62
+
63
+ ここで `requests.get()` は外部 API へのリクエストを行っていると考えてください。
64
+
65
+
66
+
67
+ この `requests.get()` をコンテキストマネージャで mock したい場合は、例えば次のようにします。
68
+
69
+
70
+
71
+ `test_client.py`:
72
+
73
+
74
+
75
+ ```python
76
+
77
+ import unittest
78
+
79
+ from unittest import mock
80
+
81
+
82
+
83
+ import client
84
+
85
+
86
+
87
+ class TestClient(unittest.TestCase):
88
+
89
+ def test_get_hoge(self):
90
+
91
+ with mock.patch('client.requests.get') as get:
92
+
93
+ get.return_value.content = 'mocked value'
94
+
95
+ c1 = client.Client()
96
+
97
+ result = c1.get_hoge()
98
+
99
+ self.assertEqual(result, 'mocked value')
100
+
101
+ ```
102
+
103
+
104
+
105
+ 私の手元ではこのテストは成功しますが、これでご質問への回答になっているでしょうか。あるいはもっと違ったものを求めてらっしゃるでしょうか。
106
+
107
+
108
+
109
+ > 何か良い検索方法をご教示いただけると
110
+
111
+
112
+
113
+ 私は公式ドキュメントの `unittest.mock` のページ ↓ を理解できるまで読むのが結局近道だと考えていて他にこれといったものも思いつけないので、他の方からの回答を待ってみてください :D
114
+
115
+
116
+
117
+ - [unittest.mock — mock object library — Python 3 documentation](https://docs.python.org/3/library/unittest.mock.html)
118
+
119
+
120
+
121
+ もしかしたら、 GitHub で `from unittest.mock import patch` 等で検索するとよいサンプルが見つかるかもしれません:
122
+
123
+
124
+
125
+ - [Search · "from unittest.mock import patch" | GitHub](https://github.com/search?q=%22from+unittest.mock+import+patch%22&type=Code)