在Python中模拟套接字连接

Cou*_*Cet 7 python unit-testing mocking

我正在尝试在python中为类编写单元测试.该类在init上打开一个tcp套接字.我试图嘲笑这个,以便我可以断言用正确的值调用连接但显然在单元测试中实际上不会发生.我已经厌倦了MagicMock,补丁等,但我还没有找到解决方案.

到目前为止我的班级看起来像这样

import socket

class MyClass(object):

    def __init__(self):
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_socket.connect('0.0.0.0', '6767')
Run Code Online (Sandbox Code Playgroud)

che*_*ner 8

如果你只是想断言它connect被正确调用,那就简单了

import mock
import socket

class MyClass(object):

    def __init__(self):
        self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_socket.connect('0.0.0.0', '6767')

with mock.patch('socket.socket'):
    c = MyClass()
    c.tcp_socket.connect.assert_called_with('0.0.0.0', '6767')
Run Code Online (Sandbox Code Playgroud)

如果您必须先导入模块才能访问MyClass,则需要稍微调整补丁:

from mymodule import MyClass
import mock

with mock.patch('mymodule.socket.socket'):
    c = MyClass()
    c.tcp_socket.connect.assert_called_with('0.0.0.0', '6767')
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3.3+中,您可以简单地将`import unittest.mock`作为`mock`现在包含在标准库中:https://docs.python.org/3/library/unittest.mock.html (2认同)