Skip to content

Instantly share code, notes, and snippets.

@shimizukawa
Last active August 2, 2018 01:21
Show Gist options
  • Save shimizukawa/f53f64630445c18e40d807cedc52c993 to your computer and use it in GitHub Desktop.
Save shimizukawa/f53f64630445c18e40d807cedc52c993 to your computer and use it in GitHub Desktop.

http://nao-y.hatenablog.com/entry/2018/08/01/231336 のコードではまった原因

Pythonでは import したモジュールはキャッシュされ、もう一度 import してもインポート処理は省略され、キャッシュが使われる

  • このため、 import_module 関数を使っても import 文を使っても、 fortune.py は1回しか実行されない
  • blogでは、この問題回避のために reload を使っている
  • このgistのコードでは、import時のコード実行にたよらずに、main関数を用意し、テストからはこれを呼ぶことで明示的に実行している

このgistのテストコードでは、patchデコレータの引数を変えた版を用意した(test2.py)。 また、テストメソッドにはmock後のオブジェクトが渡されるため、引数に m を受け取るようにした。

import random
fortunes = {
1: '凶',
2: '吉',
3: '大吉'
}
def main():
number = random.choice([1, 2, 3])
fortune = fortunes[number]
return fortune
if __name__ == '__main__':
print(main())
import unittest
from unittest.mock import patch
class FortuneTestCase(unittest.TestCase):
@patch('random.choice', lambda x: 1)
def test_bad(self):
import fortune
expect = ('凶')
self.assertEqual(fortune.main(), expect)
@patch('random.choice', lambda x: 3)
def test_good(self):
import fortune
expect = ('大吉')
self.assertEqual(fortune.main(), expect)
import unittest
from unittest.mock import patch
class FortuneTestCase(unittest.TestCase):
@patch('random.choice', return_value=1)
def test_bad(self, m):
import fortune
expect = ('凶')
self.assertEqual(fortune.main(), expect)
@patch('random.choice', return_value=3)
def test_good(self, m):
import fortune
expect = ('大吉')
self.assertEqual(fortune.main(), expect)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment