我有以下代码:
class Messenger(object):
def __init__(self):
# Class Type of what messages will be created as.
message_class = Message
def publish(self, body):
# Instantiate object of type stored in `message_class`
message = message_class(body)
message.publish()
我想断言调用了Message.publish()
方法。我该如何做到这一点?
我已经尝试了以下方法:
- 将
message_class
分配给Mock
或Mock()
。如果我调试message_class(body)
返回的内容,它是一个Mock,但我似乎无法获得实例并断言它(因为我在测试中分配的Mock不是所使用的实例,而是Type( - 用decorator修补
Message
类。每当我这样做的时候,它似乎没有捕捉到它。当我调试message_class(body)
时,它返回的是Message
类型,而不是Mock - 尝试模拟
message_class
的__init__
方法,希望我可以设置每当代码尝试实例化消息时返回的实例。不起作用,由于假定__init__
方法没有返回值而引发错误
如果您存储的是实际实例,我认为您可以执行类似messenger.message.publish.assert_called_once
的操作,但由于存储的是message_class
,这会使其稍微复杂一些。考虑到这一点,您可以从模拟的class
中提取return_value
,并以这种方式检查调用。我是这样做的:
Messenger。注意将message_class
分配给self的轻微修改。我想你是有意这么做的,否则如果没有一些全球恐惧感,它就不会起作用:
'''messenger.py'''
class Message(object):
def __init__(self, body):
self.body = body
def publish(self):
print('message published: {}'.format(self.body))
class Messenger(object):
def __init__(self):
# Class Type of what messages will be created as.
self.message_class = Message
def publish(self, body):
# Instantiate object of type stored in `message_class`
message = self.message_class(body)
message.publish()
测试:
'''test_messenger.py'''
from unittest import mock, TestCase
from messenger import Messenger
class TestMessenger(TestCase):
@mock.patch('messenger.Message')
def test_publish(self, mock_message):
messenger = Messenger()
messenger.publish('test body')
# .return_value gives the mock instance, from there you can make your assertions
mock_message.return_value.publish.assert_called_once()