簡體   English   中英

斷言傳遞給python mock中的模擬方法的對象

[英]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 使用assertEqualassertTrue等斷言方法。 斷言方法不能被意外關閉,並且它們可以提供比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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM