在我的類下的構造函數中,一個套接字對象被實例化並賦值給一個類成員。我嘲笑了套接字類,並將一個模擬套接字對象設置爲套接字構造函數調用的返回值。然後我想斷言connect()和sendall()在該對象上被調用。我總是得到assert錯誤,當我在原始的模擬類對象上聲明或者我設置爲在構造函數調用時返回的對象時,函數不會被調用。如何對實例化的模擬類對象進行斷言
我知道我不能嘲笑的類,它是測試(及其成員),因爲這將在這裏擊敗目的。
僞代碼:
import socket
Class socketHandler():
def __init__(...):
self.mySocket = socket(...)
...
self.mySocket.connect(...)
def write(message):
self.mySocket.sendall(message)
測試:
from unittest import mock
from unittest.mock import MagicMock #not sure if i need this
import pytest
import socketHandler
@mock.patch(socketHandler.socket)
def test_socket_handler(mockSocket):
...
new_sock = mock_socket()
mock_socket.return_value = new_sock
mySocketHandler = SocketHandler(...)
mock_socket.socket.assert_called_with(...)
new_sock.connect.assert_called_with(...) #fails (never called)
mock_socket.connect.assert_called_with(...) #fails (never called)
#likewise for the sendall() method call when mysocketHandler.write(..)
#is called
本試驗的目的是:
確保socket庫的構造函數被調用合適的參數。
確保連接()被調用合適的參數。
確保sendall()被調用,正是我希望它被調用,當我通過郵件到mySocketHandler.write()方法。
感謝您的回答。這不完全正確,但它幫助我找到正確的答案。對不起,我的語法錯誤,但是: –
1.您定義了一個方法,以便您不能使用對self的引用,assertIs是unittest.TestCase類中的方法! 2.當我嘗試你的代碼時,mockSocketClass.return_value.connect.assert_called_with(...)從來沒有被調用過。 爲什麼不使用MagicMock?他們的autospec或spec能力使他們非常有用。 –
對不起,我假設你使用unittest.TestCase並從你的代碼中省略了它。 你也可以使用spec和'Mock'。我避免使用它們是因爲我很少需要爲我定義的任何魔術方法,而且我不希望我的測試在他們不應該通過時通過,因爲我忘記了在MagicMock上重寫一個魔術方法 – ryanh119