2017-10-05 55 views
0

我想模擬從我的類中使用的pyserial中的Serial對象的讀寫函數來檢查調用參數並編輯返回值,但似乎沒有工作。在python中模仿成員對象的方法

目前,我有一個文件 '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

回答

0

顯然,你必須使用返回值mock_serial對象由構造函數返回的實例的,所以像

mock_serial.return_value.read.return_value = 'hello' 

這工作,但我仍然懷疑是否有更好的方法來做到這一點