[英]How do I import and monkey patch a Python module that is in a different package from the tests?
我的源代碼樹如下所示:
.
├── README.md
├── app
│ ├── __init__.py
│ ├── flask_main.py
│ └── lib.py
├── run_endpoint_check_tests.sh
├── run_flask.sh
├── run_unit_tests.sh
└── tests
├── endpoint_checks.py
└── test_lib.py
flask_main.py
(自然)像這樣import roku_lib
lib.py
但是要讓test_lib.py
導入lib.py
,我需要這樣做:
sys.path.append("app")
from app import lib
我使用它運行單元測試(在run_unit_tests.sh
中):
#!/bin/sh
python -m pytest
(我一直無法運行pytest
工作,我認為在閱讀https://docs.pytest.org/en/
這個單元測試失敗了:
def test_load_from_s3(mocker, monkeypatch):
x_mock = mocker.Mock()
return_mock = mocker.Mock()
x_mock.Object = mocker.Mock(return_value=return_mock)
monkeypatch.setattr(lib, 'get_x', lambda: x_mock)
y = lib.get_x()
x_mock.Object.assert_called_once()
...
我認為它失敗了,因為調用 lib.get_x() 會導致它導入它自己的(副本?)沒有猴子補丁的庫。
當源代碼樹如下所示時,相同的測試工作:
.
├── README.md
├── __init__.py
├── lib.py
├── uses_lib.py
└── tests
├── __init__.py
├── test_uses_lib.py
└── test_lib.py
並且sys.path.append("app")
& from app import lib
是不必要的。
但由於歷史原因,我必須將flask_main.py
保留在應用程序 package 中。 不過,如果這樣可以解決我的問題,我可以將lib.py
移動到單獨的 package 中。
所以最后我的問題...
如何修復導入或猴子補丁代碼(或兩者)以便猴子補丁工作?
是否有可能(通過在缺少的地方添加額外的空__init__.py
文件,也許?)在沒有sys.path.append("app")
的情況下讓導入在test_lib.py
中工作?
我將lib.py
移動到libs
目錄中:
.
├── README.md
├── app
│ ├── __init__.py
│ └── flask_main.py
├── libs
│ ├── __init__.py
│ ├── lib_a.py
│ └── lib_b.py
├── run_endpoint_check_tests.sh
├── run_unit_tests.sh
└── tests
├── endpoint_checks.py
├── test_lib_a.py
└── test_lib_b.py
(我將lib.py
拆分為lib_a.py
和lib_b.py
。 lib_b.py
導入lib_a
。)
我在flask_main.py
、 lib_b.py
和test_lib_a.py
和lib_b.py
中以相同的方式導入lib_a.py
和test_lib_b.py
:
sys.path.append("..")
from libs import lib_a
from libs import lib_b
現在flask_main.py
運行正常並且單元測試通過(猴子補丁斷言沒有失敗)。
注意我刪除run_flask.sh
,因為我現在必須以app
目錄作為 cwd 運行flask_main.py
。
另請注意,我仍然必須運行python -m pytest
——運行pytest
會導致 ModuleNotFoundErrors。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.