2013-06-19 83 views
4

我正在爲Python模塊module使用python的unittest框架編寫單元測試。Python重載模塊

該模塊在加載時會使用json文件進行一些「預處理」,因此它具有以下功能: module.info['xyz']可以被訪問和使用。

爲此編寫測試時,我想在每次測試之前重新加載模塊,以便在開始當前測試之前,對於每個測試,字典module.info的舊鍵不再存在。

現在我有一個reload(module)setUp(),但這似乎並沒有伎倆。我在後臺執行了其他測試,例如test_Btest_C,其中的test_A引入了舊密鑰。

我想知道是否有辦法實現我想要實現的目標,或者如果您可以指向我說明無法完成的文檔。

+0

請參閱這裏的討論 http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module –

+0

@MaximKhesin我已經通過了問題在發佈這篇文章之前,您認爲哪部分討論能夠解決我的問題? – ffledgling

回答

2

手動從sys.modules字典中刪除模塊似乎適用於我。

import sys 
import unittest 
import myModule 

class MyTest(unittest.TestCase): 
    def setUp(self): 
     global myModule 
     myModule = __import__('path.to.myModule', globals(), locals(), [''], -1) 
     return 

    def tearDown(self): 
     global myModule 
     del sys.modules[myModule.__name__] 
     return 
+0

@ffledgling:這是否適合你? – CivFan

+0

爲什麼你在'setUp()'中使用'__import __()',而不是再次使用'import myModule'?如果這是爲了在全局名稱空間中維護'myModule',是否有一種更簡單的方法,不需要知道如何使用'__import __()'? – CivFan

+0

另外,'setUp'和'tearDown'的'return'調用是多餘的。如果執行結束時沒有觸及'return'調用,則方法和函數有一個隱含的'return None'。 – CivFan