python モジュールを sys.modules から一時的に削除して、テスト ケースの一部としてインポートし (さまざまなシステム関数をモック化して)、元に戻そうとしています。(はい、それは少しクレイジーです。代わりにコードを再構築することになるかもしれませんが、今は興味があります...)
モジュールを削除して再インポートすることはできますが、完了したら元のモジュールに戻すことができないようです。(たぶん、それは不可能なのでしょうか?) このアイデアをテストするために私が書いたテスト ケースを次に示します。
class Test(unittest.TestCase):
def test_assumptions(self):
import meta.common.fileutils as fu1
del(sys.modules["meta.common.fileutils"])
import meta.common.fileutils
del(sys.modules["meta.common.fileutils"])
sys.modules["meta.common.fileutils"] = fu1 # I hoped this would set the module back
import meta.common.fileutils as fu2
self.assertEqual(fu1, fu2) # assert fails, fu2 is a new copy of module :-(
失敗する理由を誰かが提案できますか?
編集、回答の1つで提案されているように pop() を使用しても失敗します:
class Test(unittest.TestCase):
def test_assumptions(self):
import meta.common.fileutils as fu1
orig = sys.modules.pop("meta.common.fileutils")
import meta.common.fileutils
del(sys.modules["meta.common.fileutils"])
sys.modules["meta.common.fileutils"] = orig
import meta.common.fileutils as fu2
self.assertEqual(fu1, orig) # passes
self.assertEqual(fu2, orig) # fails
self.assertEqual(fu1, fu2) # fails