python - 从存储在变量中的类创建的模拟实例
问题描述
我有以下代码:
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 不是使用的实例,而是类型)。 Message
带有装饰器的补丁类。每当我这样做时,它似乎都没有抓住它。当我调试message_class(body)
返回其Message
类型而不是 Mock 的内容时。- 尝试模拟 的
__init__
方法,message_class
希望我可以设置在代码尝试实例化消息时返回的实例。不起作用,抛出错误,因为该__init__
方法不应该有返回值。
解决方案
如果您要存储实际实例,我会说您可以执行类似的操作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()
推荐阅读
- javascript - 想在 Select2 中使用 YDN-db 数据库而不是 Ajax
- android - Android SurfaceTexture 时间戳始终为零
- sql - 具有列存在的 case 语句
- c# - 在 Unity 2020.3 中的脚本之间传递值
- javascript - 如何将以下 JS 代码转换为 VueJS
- r - !LaTeX3 错误:检测到不匹配的 LaTeX 支持文件。(LaTeX3)加载“expl3.sty”中止!(乳胶3)
- python - 保存后更改的 .txt 导致 CSV 阅读器看到太多字段
- ios - 如何在 SwiftUI/Swift 中设置自定义随机范围
- angular - Angular 为按钮元素创建我自己的属性(不使用 ngClass 或类)
- javascript - 如何选择一个拆分元素并使用 JavaScript 操作它的 DOM?