尝试模拟UDP套接字时获取两个模拟实例

时间:2018-09-13 12:42:40

标签: python python-2.7 mocking pytest

努力在python 2.7中模拟UDP套接字。

test_udp_send.py

@patch("socket.socket")
def test_udp_send(mock_socket):

    # Call to module that sends UDP message is here

    assert mock_socket.sendto.call_count == 1

udp_send.py

...
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
buffer = get_data()
sock.sendto(buffer, (ipaddress, port))
...

运行测试时,出现以下错误消息:

>       assert mock_socket.sendto.call_count == 1
E       AssertionError: assert 0 == 1
E        +  where 0 = <MagicMock name='socket.sendto' id='75045800'>.call_count
E        +    where <MagicMock name='socket.sendto' id='75045800'> = <MagicMock name='socket' id='74744552'>.sendto

我在发送代码周围放置了print条语句,可以看到它已被调用。

有趣的是,我的测试代码报告中对print执行了mock_socket

<MagicMock name='socket' id='75186920'>

在发送UDP消息的实际代码中,我得到了:

<MagicMock name='socket()' id='75189048'>

这使我觉得出于某种原因我有两个不同的模拟对象。如果我然后将其添加到测试代码中,如下所示...

udp_send.py

...
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
buffer = get_data()
sock.sendto(buffer, (ipaddress, port))
print sock.sendto.call_count      # Additional code

我在控制台中收到1的报告。因此,在实际的udp发送代码中,我确实有一个模拟对象,并且正在调用它。由于某些原因,我无法在测试代码中使用相同的模拟。

我的模拟设备在某处设置有问题,但我看不到什么。

0 个答案:

没有答案