teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2016/11/04 00:58

投稿

sharow
sharow

スコア1151

answer CHANGED
@@ -30,17 +30,44 @@
30
30
  main()
31
31
  ```
32
32
 
33
+ この例では`input()`が`'hoge'`を返すだけの関数に置き換えられています。`return_value`だけでなく、`side_effect`で関数を指定することもできます。詳しくは[ドキュメント](http://docs.python.jp/3/library/unittest.mock.html)をご覧ください。
34
+
35
+ ## 追記
36
+
37
+ なるほどimport時に実行されるコードの副作用ですか。一応できなくはないみたいですが、なんかちょっと危なっかしい気もします。そういうことならsubprocessを使った方法もあながち悪くないかもしれませんね。
38
+
39
+
40
+ ```python
41
+ #wanko.py
42
+ name = input()
43
+ print(name,name)
33
44
  ```
34
- $ python a.py
35
- hogehogehoge
36
- hogehogehoge hogehogehoge
37
45
 
46
+ ```python
47
+ import sys
48
+ import io
38
- $ python a.py test
49
+ import unittest
39
- .
40
- ----------------------------------------------------------------------
41
- Ran 1 test in 0.000s
50
+ import unittest.mock as mock
42
51
 
52
+ class TestWanko(unittest.TestCase):
53
+ def setUp(self):
54
+ self.orig_stdout = sys.stdout
55
+ sys.stdout = io.StringIO()
56
+
57
+ def tearDown(self):
58
+ sys.stdout = self.orig_stdout
59
+ if 'wanko' in sys.modules:
60
+ del sys.modules['wanko']
61
+
62
+ @mock.patch('builtins.input', return_value='hoge')
63
+ def test0(self, *args, **kwarg):
43
- OK
64
+ import wanko
65
+ self.assertEqual(sys.stdout.getvalue(), 'hoge hoge\n')
66
+
67
+ @mock.patch('builtins.input', return_value='wan')
68
+ def test1(self, *args, **kwarg):
69
+ import wanko
70
+ self.assertEqual(sys.stdout.getvalue(), 'wan wan\n')
71
+
72
+ unittest.main()
44
73
  ```
45
-
46
- この例では`input()`が`'hoge'`を返すだけの関数に置き換えられています。`return_value`だけでなく、`side_effect`で関数を指定することもできます。詳しくは[ドキュメント](http://docs.python.jp/3/library/unittest.mock.html)をご覧ください。