簡體   English   中英

如何跨子模塊導入

[英]How do I import across submodules

我們已經有了一個使用鼻子和 factory_boy 的測試框架。

按照建議,我們在每個模塊目錄中放置了一個 /test 目錄,這就是我們放置 factory.py 文件和各種測試用例的地方。

我面臨的挑戰是嘗試在這些測試子模塊之間導入工廠和函數。 完整代碼分支在這里:

https://github.com/bethlakshmi/GBE2/tree/GBE-471

萬一我沒有傳達足夠的細節有用。

詳細問題

相關結構總結如下:

/gbe
    __init__.py
    tests.py
    (many more files)
    /tests
         __init__.py
         factories.py
         functions.py
         (many files of tests, all tests_*)
/ticketing
    __init__.py
    tests.py
    /tests
         __init__.py
         factories.py
         test_edit_event.py

問題發生在最后一個文件夾中。

我似乎無法從 gbe.tests 導入任何東西,我想重用 factory.py 中提供的模擬和 functions.py 中的函數

無論我嘗試什么,始終以以下兩種形式出現:

Traceback (most recent call last):
File "/Users/bethlakshmi/Documents/mysite/GBE2/expo/ticketing/test/test_edit_event.py", line 27, in setUp
self.privileged_user = gbe_tests.factories.ProfileFactory.create().user_object
AttributeError: 'module' object has no attribute 'factories'

或類似的東西:

Traceback (most recent call last):
    File "/Library/Python/2.7/site-packages/nose/loader.py", line 420, in loadTestsFromName
      addr.filename, addr.module)
    File "/Library/Python/2.7/site-packages/nose/importer.py", line 47, in importFromPath
      return self.importFromDir(dir_path, fqname)
    File "/Library/Python/2.7/site-packages/nose/importer.py", line 94, in importFromDir
      mod = load_module(part_fqname, fh, filename, desc)
    File "/Users/bethlakshmi/Documents/mysite/GBE2/expo/ticketing/test/test_edit_event.py", line 12, in <module>
      import gbe.tests.factories as gbe_fact

    ImportError: No module named factories

我嘗試過的事情:

  • “從 gbe.tests 導入函數,工廠”的各種變體
  • 各種形式的“將 gbe.tests 導入為 gbe_test”並相應地重命名對工廠和函數的調用。
  • 弄亂init .py 文件以在那里導入,或將全部設置為 functions.py 和 factory.py

我試圖運行的命令是:

./manage.py 測試票

據我所知,對於代碼,gbe.tests 的內部內容根本不存在。 我在導入 gbe.models、gbe.views、gbe.functions 等方面沒有問題。我在 /ticketing 中也沒有任何問題

我已經閱讀了 stackoverflow 中的每個問題,但都沒有成功。

90% 的接受答案似乎是“確保你有一個init .py”——這在我的情況下已經是正確的。

我也嘗試弄亂系統路徑,但沒有成功。

筆記:

你會看到我在ticketing/tests/factories.py 中重復了我想模擬的工廠——這是我可以在ticketing 中運行測試的唯一方法,並且我拒絕在簽入時破壞測試,如果我可以幫忙。

我已經嘗試刪除這些類,並且上面的錯誤占了上風 - 當我可以重構以刪除這些冗余代碼時,我會非常高興地這樣做。

最后的問題

我錯過了什么?

問題出在您的包結構中:

/gbe
    __init__.py
    tests.py
    /tests
         __init__.py
         factories.py
         functions.py

您有一個文件tests.py和一個包tests 現在當你想from gbe.tests import x python 解釋器不知道你是想從文件還是包中導入,默認情況下會嘗試從文件中導入。

為了解決這個問題,我建議你將你的tests.py移動並重命名為tests包。

請注意,慣例是將測試文件夾放在主應用程序文件夾之外,例如flask所做的。 我個人使用以下結構進行測試:

/tests
    /my_app
        test_views.py
    /integration
    /factories
    /fixtures
        mocks.py
/my_app
    views.py

所以我有一個tests/my_app文件夾,我在其中復制了 my_app 的結構 - 我只在那里放置了單元測試。
我也有tests/integration文件夾,我不復制 my_app 的結構 - 我在那里使用不同的命名。
我將我的工廠類和夾具分組在一個單獨的文件夾中,如果我願意,我可以在所有測試中使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM