[英]How to patch a module that does not exist on the machine running the unit test in python?
我在自定義 SBC 上運行 python 代碼,它使用自定義庫與硬件交互(稱為customlib
)。
但是,我想對我的開發機器上的代碼運行一些單元測試。 我不想在我的機器上安裝這個自定義庫,因為這是一個費力又煩人的過程。
問題:是否可以修補該庫,以便我仍然可以在我的開發機器上運行單元測試?
應用結構:
.
├── app.py
├── sensor
│ ├── __init__.py
│ └── main.py
└── test_sensor.py
app.py
目前沒有任何代碼
# __init__.py
from .main import a
# main.py
import customlib
def a():
customlib.func()
# test_sensor.py
import unittest
from unittest.mock import patch
class TestBasicSense(unittest.TestCase):
@patch("sensor.customlib")
def test_get(self):
import sensor
sensor.a()
if __name__ == "main":
unittest.main()
當我運行python -m unittest
,出現導入錯誤:
File "/projects/myapp/sensor/main.py", line 2, in <module>
import customlib
ModuleNotFoundError: No module named 'customlib'
我可以創建一個虛擬的 customlib 庫並將其安裝在我的開發機器上,但這似乎是不必要的污染。
任何幫助表示贊賞。
我在類似的情況下使用了以下內容:將導入包裝在 try/catch 塊中:
# main.py
try:
import customlib
except:
customlib = None
# ... the rest of the code
然后在測試中打補丁,只需確保在main.py中打補丁,而不僅僅是在模塊級別:
# test_sensor.py
from unittest.mock import patch
from unittest.mock import MagicMock
import sensor
class TestBasicSense(unittest.TestCase):
def test_get(self):
fake_lib = MagicMock()
fake_lib.func = MagicMock()
with patch('sensor.main.customlib', new=fake_lib)
sensor.a()
fake_lib.func.assert_called()
安裝應該不費力,您只需要一個基本的setup.py
即可pip install -e
如果您可以訪問源代碼。
from setuptools import setup
setup()
或者,我想您可以將所有內容復制到您的開發機器站點包中,或者如果兩個 linux.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.