[英]Asserting an object passed into a mocked method in the python mock
假設我有一個名為Client的類,它創建Request類的對象並將其傳遞給Connection對象的方法:
class Client(object):
def __init__(self, connection):
self._conn = connection
def sendText(plaintext):
self._conn.send(Request(0, plaintext))
我想斷言傳遞給Connection.send方法的對象來檢查它的屬性。 我首先創建一個模擬的Connection類:
conn = Mock()
client = Client(conn)
client.sendText('some message')
然后我想要這樣的東西:
conn.send.assert_called_with(
(Request,
{'type': 0, 'text': 'some message'})
)
其中'type'和'text'是Request的屬性。 有沒有辦法在python的模擬中執行此操作? 我在文檔中找到的只是簡單的數據示例。 我可以用mock.patch裝飾器完成它,用一個斷言對象字段的方法替換原來的'send'方法:
def patchedSend(self, req):
assert req.Type == 0
with mock.patch.object(Connection, 'send', TestClient.patchedSend):
...
但在這種情況下,我必須為每個方法檢查定義一個separete mocked函數,如果函數已被調用,我無法檢查(沒有額外的編碼)。
你可以獲得模擬的最后一個參數
request, = conn.send.call_args
然后斷言關於它的屬性。 如果您希望工具表達更復雜的關於事物的斷言,您可以安裝PyHamcrest 。
注意:不要在單元測試中使用assert
。 使用assertEqual
或assertTrue
等斷言方法。 斷言方法不能被意外關閉,並且它們可以提供比assert
語句更有用的消息。
嗯,我認為在這種特定情況下,最簡單和更好的方法是創建一個函數來創建請求,然后模擬它。
例如,它是這樣的:
class Client(object):
def __init__(self, connection):
self._conn = connection
def _create_request(self, plain_text):
return Request(0, plain_text)
def send_text(self, plaintext):
self._conn.send(self._create_request(plain_text))
然后,在測試中,您可以模擬_create_request
以返回一些特定值,然后斷言send_text
是用它調用的。
您也可以按照建議通過call_args獲取參數,但我認為這樣看起來更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.