gpt4 book ai didi

python - MagicMock @patch 没有按我的预期工作

转载 作者:行者123 更新时间:2023-12-01 05:21:13 26 4
gpt4 key购买 nike

(Python 2.6)

我在 MagicMock 修补中遗漏了一些东西

给出以下生产代码:

class MyQueue(object):
def send(self, message):
pass

class MessageSender(object):
def send_all(self, messages):
queue = MyQueue()
for message in messages:
queue.send(message)

我有以下测试:

class MessageSenderTest(TestCase):
@patch('path.to.MyQueue')
def test_can_send_all_messages(self, queue):
messages = ['foo', 'bar', 'baz']
sender = MessageSender()
sender.send_all(messages)
queue.send.assert_has_calls([call(message) for message in messages])

这给了我:

AssertionError: Calls not found.
Expected: [call('foo'), call('bar'), call('baz')]
Actual: []

我认为 sender 生成的模拟将允许我做出断言。

最佳答案

请注意,您没有使用在测试方法中收到的已修补的 queue 实例进行任何操作,因为它是由您的 MessageSender 类实例化的。这会导致每次调用 send 方法时都会实例化模拟的 MyQueue。事实上,您可以稍微修改您的断言并获得以下调用列表:

expected = [call()] + [call().send(message) for message in messages]
self.assertEquals(queue.mock_calls, expected)

在这种形式下,测试通过。不过,我认为 MessageSender 类在其构造函数方法中接收 MyQueue 会更自然,这样就可以在测试中模拟它。请参阅此替代实现:

# file: main.py

class MyQueue(object):

def send(self, message):
pass


class MessageSender(object):

def __init__(self, queue):
self.queue = queue

def send_all(self, messages):
for message in messages:
self.queue.send(message)

使用这个,测试读起来更加自然:

# file: test.py

import unittest

from mock import patch, call

import main


class MessageSenderTest(unittest.TestCase):

@patch('main.MyQueue')
def test_can_send_all_messages(self, queue):
messages = ['foo', 'bar', 'baz']
sender = main.MessageSender(queue) # <-- here is where you do use `queue`
sender.send_all(messages)
queue.send.assert_has_calls([call.send(message) for message in messages])

if __name__ == '__main__':
unittest.main()

关于python - MagicMock @patch 没有按我的预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22324757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com