簡體   English   中英

如何導入和猴子補丁 Python 模塊,該模塊位於與測試不同的 package 中?

[英]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.pylib_b.pylib_b.py導入lib_a 。)

我在flask_main.pylib_b.pytest_lib_a.pylib_b.py中以相同的方式導入lib_a.pytest_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.

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