Если бы вы хранили реальный экземпляр, я бы сказал, что вы могли бы сделать что-то вроде messenger.message.publish.assert_called_once
, но, поскольку message_class
сохраняется, это делает его немного хитрее. Учитывая это, вы можете вытащить return_value
из смоделированного class
и проверить вызов таким образом. Вот как я это сделал:
Посланник. Обратите внимание на небольшую модификацию для присвоения message_class
для себя. Я предполагаю, что вы хотели это сделать, иначе это не сработало бы без какой-то глобальной фанки:
'''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()