0

我正在实现一个使用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进行修补,但看起来不像。

4

0 回答 0