我正在实现一个使用can总线实例的类(总线实例是静态的,因为所有对象都应该使用相同的)。
# ./mymodule/__init__.py
import can
class UsingCanBUS:
_bus = can.ThreadSafeBus(channel='can0', bustype='socketcan')
def __init__(self) -> None:
# other code
# v here every object interacts with the bus
self._listener = can.Listener()
self._listener.on_message_received = self._handle_message
def _send_message(self, id, data) -> bool:
msg = can.Message(arbitration_id=id, data=data, extended_id=False)
try:
self._bus.send(msg)
except can.CanError:
return False
else:
return True
此代码最终将在树莓上运行,因此可以在系统中正确设置 can 接口。
现在,如果我想对模块中的任何类方法或任何文件进行单元测试,总线会尝试初始化,并且由于我不在目标系统上,它会引发操作系统错误(这是意料之中的)。
文件夹结构如下:
.
|- mymodule/
| |- __init__.py
| |- utils.py
|
|- tests/
| |- __init__.py
| |- test_utils/
| | |- __init__.py
| | |- test_utils.py
我不清楚我应该如何测试这段代码。我尝试修补 can 模块:
#./tests/test_utils/test_utils.py
import pytest
from unittest.mock import patch
@patch('mymodule.can')
def test_something():
from mymodule.utils import some_function
# This doesn't work as the real python-can methods get called instead of the mocked ones
assert some_function() == expected_result
我不明白我是否使用了错误的补丁装饰器,或者我的方法是否完全偏离了方向。我希望从导入的 can 模块中的每个类都使用模拟类mymodule
进行修补,但看起来不像。