从存储在变量中的类创建的模拟实例



我有以下代码:

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()方法。我该如何做到这一点?

我已经尝试了以下方法:

  1. message_class分配给MockMock()。如果我调试message_class(body)返回的内容,它是一个Mock,但我似乎无法获得实例并断言它(因为我在测试中分配的Mock不是所使用的实例,而是Type(
  2. 用decorator修补Message类。每当我这样做的时候,它似乎没有捕捉到它。当我调试message_class(body)时,它返回的是Message类型,而不是Mock
  3. 尝试模拟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()

最新更新