簡體   English   中英

如何修補在python中運行單元測試的機器上不存在的模塊?

[英]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.

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