Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中模拟成员对象方法_Python_Unit Testing_Mocking - Fatal编程技术网

在python中模拟成员对象方法

在python中模拟成员对象方法,python,unit-testing,mocking,Python,Unit Testing,Mocking,我想模拟pyserial中串行对象的读写函数,它在我的类中使用,以检查调用参数和编辑返回值,但它似乎不起作用 目前我有一个文件“serialdevice.py”,如下所示: import serial class SerialDevice: def __init__(self): self._serial = serial.Serial(port='someport') def readwrite(self, msg): self._seria

我想模拟pyserial中串行对象的读写函数,它在我的类中使用,以检查调用参数和编辑返回值,但它似乎不起作用

目前我有一个文件“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)
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'
然后我有一个文件“test\u 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)
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方法返回一个mock对象,而不是
'hello'
字符串。我还尝试过使用
@patch('serial.serial.write)
等,结果也一样。同样使用
mock\u serial
的返回对象,例如
mock\u read=mock\u serial.read()
似乎不起作用

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

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


python版本是2.7.9

显然,您必须使用mock_serial对象的返回值作为构造函数返回的实例,例如

mock_serial.return_value.read.return_value = 'hello'

这是可行的,但我仍然想知道是否有更好的方法来实现这一点

显然,您必须使用mock_serial对象的返回值作为构造函数返回的实例,例如

mock_serial.return_value.read.return_value = 'hello'
这是可行的,但我仍然想知道是否有更好的方法来做到这一点