python - 从pyserial继承时模拟
问题描述
我有一个继承自pyserial
的类的serial.Serial
类,它看起来像这样:
class SYM1(serial.Serial):
def __init__(self, *args, debug=None, baudrate=4800, timeout=1, **kwargs):
super().__init__(*args, baudrate=baudrate, timeout=timeout, **kwargs)
LOG.info('using port %s', self.port)
def read(self, count):
...
return super().read(count)
def write(self, data):
...
return super().write(data)
def connect(self):
...
def send_command(self, cmd, *args):
...
我想为该类编写单元测试,但我不确定如何最好地进行设置,以便 (a)SYM1
类上定义的方法可以正常调用,而 (b) 继承自的方法serial.Serial
被模拟出来。
我从这个开始:
import pytest
import serial
from unittest import mock
serial.Serial = mock.MagicMock
from symtool import symtool # NOQA
@pytest.fixture
def sym(monkeypatch):
s = symtool.SYM1('TESTDEV')
s.connect()
return s
def test_connect(sym):
pass
但这在这里失败了:
LOG.info('using port %s', self.port)
和:
AttributeError: Mock object has no attribute 'port'
这让我感到困惑,因为如果它是一个mock.Mock
对象,我会期望:
>>> from unittest import mock
>>> m = mock.Mock()
>>> m.port
<Mock name='mock.port' id='139910315631568'>
这不仅仅是简单的属性;如果我注释掉导致第一个的行AttributeError
,它会在稍后调用时失败super().write
:
AttributeError: 'super' object has no attribute 'write'
这里发生了什么,正确的方法是什么?
解决方案
推荐阅读
- python - 无法渲染模板 Odoo 13
I want to send email to manager group in pos, and added it in the chatter. So, I added a template, and added code to send email in the python function. But, I got the following error:
<- docker - 请求负载高时出现 GKE pod 连接问题
- react-native - undefined is not an object (evaluating '_this.state.BankName.trim') in react native
- google-cloud-firestore - 持久性数据应该存储在子集合还是集合中?
- python - Launching Blender console in Docker container with Django
- python - Why my thread doesn't stop after function finished?
- roles - Add a new firebird-db user with acces to specific tables?
- jquery - FadeOut JQuery 函数不适用于每个对象
- html - Trying to get property 'name' of non-object when trying to click next page using pagination
- oracle - 在 Oracle 11 中识别系统表