在python中模拟成员对象方法

时间:2017-10-05 09:19:00

标签: python unit-testing mocking

我想从我的类中使用的pyserial模拟Serial对象的读写函数来检查调用参数并编辑返回值,但它似乎不起作用。

目前我有一个'serialdevice.py'文件,如下所示:

import serial

class SerialDevice:
    def __init__(self):
        self._serial = serial.Serial(port='someport')

    def readwrite(self, msg):
        self._serial.write(msg)
        return self._serial.read(1024)

然后我有一个'test_serialdevice.py'文件,如下所示:

import mock
from serialdevice import SerialDevice

@mock.patch('serialdevice.serial.Serial.read')
@mock.patch('serialdevice.serial.Serial.write')
@mock.patch('serialdevice.serial.Serial')
def test_write(mock_serial, mock_write, mock_read):
    mock_read.return_value='hello'
    sd = SerialDevice()
    resp = sd.readwrite('test')

    mock_write.assert_called_once_with('test')
    assert resp == 'hello'

但两个断言都失败了。不知何故,mock_write不会使用参数'test'调用,而write方法返回模拟对象而不是'hello'字符串。我也试过使用@patch('serial.Serial.write)等同样的结果。同样使用mock_serial的返回对象,例如mock_read = mock_serial.read()似乎不起作用。

然而,构造函数(即mock_serial)似乎确实使用预期的参数调用。

在这种情况下,如何实现我想要的目标?

python版本是2.7.9

1 个答案:

答案 0 :(得分:0)

显然你必须使用mock_serial对象的返回值作为构造函数返回的实例,所以类似

{!! json_encode($labels) !!}

这有效,但我仍然想知道是否有更好的方法来做到这一点