2017-10-05 7 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' 

のようなものがこの作品です私はまだこれを行うより良い方法があるのだろうかと疑問に思う

関連する問題