質問編集履歴

9

追記日時を記載

2019/05/02 05:49

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -114,7 +114,7 @@
114
114
 
115
115
  #### インスタンス変数をmockで置き換えることができた例(すごく汚いコード)
116
116
 
117
-
117
+ (2019/05/02 追記)
118
118
 
119
119
  ```python
120
120
 

8

実際のコードに近づけた

2019/05/02 05:49

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -130,9 +130,9 @@
130
130
 
131
131
  # ...色々省略しています...
132
132
 
133
- req = something_api.Reqetsing()
133
+ something_api.Reqetsing(some_object)
134
-
134
+
135
- self.api_response = req.response
135
+ self.api_response = some_object.response
136
136
 
137
137
 
138
138
 
@@ -182,6 +182,10 @@
182
182
 
183
183
  with patch('abcd.something_api.Requesting', side_effect=[_mock]):
184
184
 
185
+ # client.py の `something_api.Reqetsing` も mock で置き換えた
186
+
187
+ with patch('***.***.***', return_value=None):
188
+
185
189
  hoge = self.client_instance.get_hoge()
186
190
 
187
191
 

7

質問文を区切った

2019/05/02 05:48

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -194,6 +194,10 @@
194
194
 
195
195
 
196
196
 
197
+ # インスタンス変数をmock化したい理由
198
+
199
+
200
+
197
201
  mockとpatchで2回の置き換えを行っているのが不満で、どうにかこれを「1回で済ませたいな」という思いから、インスタンス変数をmock化したいと思っています。
198
202
 
199
203
 

6

知りたいことの理由説明を追加

2019/04/29 12:23

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -191,3 +191,11 @@
191
191
  ```
192
192
 
193
193
  メソッドの細部の書き換えや省略をしているので誤記があるかもしれませんが、ほぼこのような動きです。
194
+
195
+
196
+
197
+ mockとpatchで2回の置き換えを行っているのが不満で、どうにかこれを「1回で済ませたいな」という思いから、インスタンス変数をmock化したいと思っています。
198
+
199
+
200
+
201
+ それだけでなくインスタンス変数をmock化する方法自体も純粋に知りたいので、できればメソッドのmock化ではなく、インスタンス変数のmock化の方法を回答いただきたいです。

5

追記の誤記を修正

2019/04/29 12:22

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -122,7 +122,7 @@
122
122
 
123
123
 
124
124
 
125
- import abcd.something_api
125
+ import abcd.something_api as something_api
126
126
 
127
127
  class Client():
128
128
 

4

動作するサンプルを追記

2019/04/29 12:17

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -105,3 +105,89 @@
105
105
  たとえばここ
106
106
 
107
107
  [unittest.mock --- 入門¶](https://docs.python.org/ja/3/library/unittest.mock-examples.html)
108
+
109
+
110
+
111
+ # 追記
112
+
113
+
114
+
115
+ #### インスタンス変数をmockで置き換えることができた例(すごく汚いコード)
116
+
117
+
118
+
119
+ ```python
120
+
121
+ # client.py
122
+
123
+
124
+
125
+ import abcd.something_api
126
+
127
+ class Client():
128
+
129
+ def __init__(self):
130
+
131
+ # ...色々省略しています...
132
+
133
+ req = something_api.Reqetsing()
134
+
135
+ self.api_response = req.response
136
+
137
+
138
+
139
+ def get_hoge(self):
140
+
141
+ # self.api_response をここでごちゃごちゃといじるのですが省略します
142
+
143
+ result = self.api_response['hoge']
144
+
145
+ return result
146
+
147
+
148
+
149
+ # 以下インスタンスメソッドが続きます
150
+
151
+
152
+
153
+
154
+
155
+ # test.py
156
+
157
+ import unittest
158
+
159
+ from unittest import mock
160
+
161
+ from unittest.mock import patch
162
+
163
+ import models.client as client
164
+
165
+
166
+
167
+ class TestClient(unittest.TestCase):
168
+
169
+ def setUp(self):
170
+
171
+ self.client_instance = client.Client()
172
+
173
+
174
+
175
+ def test_get_hoge_method(self):
176
+
177
+ response_msg = 'dummy_responseです'
178
+
179
+
180
+
181
+ _mock = mock.MagicMock(response={ hoge: response_msg })
182
+
183
+ with patch('abcd.something_api.Requesting', side_effect=[_mock]):
184
+
185
+ hoge = self.client_instance.get_hoge()
186
+
187
+
188
+
189
+ self.assertEqual(hoge, response_msg, 'get_hogeがresponseに対して正しく操作を行っていることを確認する')
190
+
191
+ ```
192
+
193
+ メソッドの細部の書き換えや省略をしているので誤記があるかもしれませんが、ほぼこのような動きです。

3

ソースコードの具体化2

2019/04/29 12:13

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- models/module1.py 内のクラスのインスタンス変数をmock化したいです。
1
+ models/client.py 内のクラスのインスタンス変数hogeをmock化したいです。
2
2
 
3
3
  tests/test.py にテストコードを書いています。
4
4
 
@@ -78,6 +78,10 @@
78
78
 
79
79
  ```
80
80
 
81
+ # やりたいこと
82
+
83
+ テストにおいて実際にAPIに対してrequestしたくないので、self.hogeをmockで仮想responseに置き換える。
84
+
81
85
 
82
86
 
83
87
  # 試したこと

2

ソースコードの具体化

2019/04/29 04:04

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -32,13 +32,15 @@
32
32
 
33
33
  # ...色々省略しています...
34
34
 
35
- self.hoge = 'hoga' # <= これをpatchで'hoge'に書き換えたい
35
+ self.hoge = # 外部APIに対するrequestのresponse結果が代入される
36
36
 
37
37
 
38
38
 
39
39
  def get_hoge(self):
40
40
 
41
+ result = # self.hoge をここでごちゃごちゃといじる
42
+
41
- return self.hoge
43
+ return result
42
44
 
43
45
 
44
46
 
@@ -66,13 +68,13 @@
66
68
 
67
69
 
68
70
 
69
- def test_hoge_method(self):
71
+ def test_get_hoge_method(self):
70
72
 
71
73
  with patch('models.client.???', ???=???):
72
74
 
73
75
  hoge = self.client_instance.get_hoge()
74
76
 
75
- self.assertEqual(hoge, 'hoge', 'インスタンス変数の中身hogeであることを確認')
77
+ self.assertEqual(hoge, 望ましい結果, 'get_hogeがresponseに対して正しく操作を行っていることを確認する')
76
78
 
77
79
  ```
78
80
 

1

誤記修正とテストケースの説明追記

2019/04/29 04:02

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -72,7 +72,7 @@
72
72
 
73
73
  hoge = self.client_instance.get_hoge()
74
74
 
75
- self.assert_equal(hoge, 'hoge')
75
+ self.assertEqual(hoge, 'hoge', 'インスタンス変数の中身がhogeであることを確認')
76
76
 
77
77
  ```
78
78