在我的类下的构造函数中,一个套接字对象被实例化并赋值给一个类成员。我嘲笑了套接字类,并将一个模拟套接字对象设置为套接字构造函数调用的返回值。然后我想断言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