【问题标题】:mocking a socket connection in Python在 Python 中模拟套接字连接
【发布时间】:2015-08-06 19:23:55
【问题描述】:

我正在尝试为 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')

【问题讨论】:

  • 为什么不直接连接?
  • @JoranBeasley 因为如果连接建立时间过长,它可能会导致构建停滞。这就是我们需要模拟的原因。

标签: python unit-testing mocking


【解决方案1】:

如果你只想断言 connect 被正确调用,那么简单的 as

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')

如果您必须先导入模块才能访问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')

【讨论】:

猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
相关资源
最近更新 更多