首页 > 解决方案 > 从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' 

这里发生了什么,正确的方法是什么?

标签: pythonunit-testingmockingpytest

解决方案


推荐阅读