python - 具有复杂 __init__ 的类的单元测试
问题描述
我有一个有几种方法的类,我想为它们编写单元测试。我面临的问题是这个类有一个__init__
查询数据库的方法,想象一下:
class MyClass:
accepted_values = ['a', 'b', 'c']
def __init__(self, database_name):
self.database = database_name
self.data = self.query_database()
def query_database(self):
data = query_this_database(self.database)
# clean data
return data
def check_values_in_db(self, column_name):
column = data.column_name
if any(item not in self.accepted_values for item in column):
print('Oh noes!')
else:
print('All good')
现在,鉴于此,我想使用一些模拟数据对最后一个方法进行单元测试,但我不能,因为如果我初始化类,它会想要查询数据库。由于要实际进行查询,需要一个 API 密钥、权限等,这使情况变得更加复杂,而这正是我在单元测试期间想要避免的。
一般来说,我对 OOP 和单元测试比较陌生,所以我什至不确定我是否正确地构建了我的类:也许该方法query_database()
应该只在稍后阶段调用,而不是在__init__
?
编辑:
被要求添加一些细节,所以这里是:
此类属于按计划运行的 AWS lambda 函数。每小时,此类查询最后一小时的数据库,并根据一些预定义的值检查特定列。
如果列中的任何值不属于这些预定义值,它会发送警报电子邮件。我想测试这个特定的功能,但不必查询数据库,而只需使用模拟值。
我相应地编辑了代码以反映我的意思。
解决方案
您仍然可以在不创建实例的情况下调用类方法,但是如果您尝试调用已在__init__
.
您可能还想考虑在主代码之外创建一个空白变量数据__init__
,然后调用classinstance.data = classinstance.query_database()
。
推荐阅读
- windows - 如何清除 Windows 事件日志而不显示任何错误消息?
- python - pygame中的优化和抽象
- r - 我将如何创建这个数据框?我需要使用嵌套的 for 循环吗?
- c - 尝试扫描字符串时如何解决分段错误?
- reactjs - OAuth 流程仅适用于刷新,而不适用于单击链接
- c# - 我们可以使用 TestAdaptor 和 TestFlow 对自适应卡回复进行测试吗?机器人框架
- sas - 当中间名出现时,将全名分为名字和姓氏
- latex - 如何在 Tex 中读取多个文件并将内容写入单个文件?
- azure - SAML 和 MSAL 的区别?哪一个应该用VB代码设置?
- c# - 如何修复“无法将属性或索引器‘PlayerController.Modifier’分配给——它是只读的”错误?