2015-06-19 135 views
1

我有一個包含測試模塊和init文件內部的包,我有一個包含一些操作的setUp方法。在程序包模塊中的任何單元測試運行之前,這些操作都可以正確執行。在setUp方法中,我想初始化一個全局變量,然後從包中的其他模塊訪問它。但這不起作用。Python:無法從初始化文件中導入在setUp方法中初始化的全局變量

# TestPackage/__init__.py 
def setUp(): 
    global spec_project 
    core_manager = get_core_manager() 
    spec_project = core_manager.get_spec() 

#TestPackage/test_module.py 
from TestPackage import spec_project 
import unittest 

class TestRules(unittest.TestCase): 
    def setUp(self): 
     spec_project.get_new_device() 

喜歡我得到一個

ImportError: cannot import name spec_project

如果我初始化spec_project變量在init文件中設置方法,我可以訪問它的外部,但是其內容在手術後沒有改變setUp方法。

# TestPackage/__init__.py 
spec_project = None 
def setUp(): 
    global spec_project 
    core_manager = get_core_manager() 
    spec_project = core_manager.get_spec() 

#TestPackage/test_module.py 
from TestPackage import spec_project 
import unittest 

class TestRules(unittest.TestCase): 
    def setUp(self): 
     spec_project.get_new_device() 

喜歡我得到一個

AttributeError: 'NoneType' object has no attribute 'get_new_device'

如何初始化init文件的設置方法裏面spec_project變量,仍必須在包裝從其他模塊訪問它?

+1

*「在程序包模塊中的任何單元測試運行之前,這些操作都已正確執行。」* - 您確定,因爲它好像沒有運行。 – jonrsharpe

+0

@jonrsharpe我很確定,我可以在package setUp方法中打印內容以確保它按預期運行。 – PetMarion

+0

''__init __。setUp'應該在導入TestPackage時運行嗎?我無法複製這種行爲。 – chepner

回答

1

它看起來像setUp()沒有被調用,但如果你確定它是,那麼它可能是你導入TestPackage的方式。嘗試像這樣導入:

#TestPackage/test_module.py 
import TestPackage 
import unittest 

class TestRules(unittest.TestCase): 
    def setUp(self): 
     TestPackage.spec_project.get_new_device() 

在使用全局之前,必須調用setUp()方法。這同樣的事情應該適用於你嘗試的第二種方式。但是,再次假設setUp運行。如果您覺得有必要,您可以使用別名TestPackage,或者如果在方法外定義,您應該可以導入它。

由於您明確導入它,因此它可能會嘗試複製它,因爲它位於setUp()主體內部,所以這是不可能的。

+0

這樣它的工作原理,謝謝! – PetMarion