首页 > 解决方案 > 具有复杂 __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 函数。每小时,此类查询最后一小时的数据库,并根据一些预定义的值检查特定列。

如果列中的任何值不属于这些预定义值,它会发送警报电子邮件。我想测试这个特定的功能,但不必查询数据库,而只需使用模拟值。

我相应地编辑了代码以反映我的意思。

标签: pythonunit-testing

解决方案


您仍然可以在不创建实例的情况下调用类方法,但是如果您尝试调用已在__init__.

您可能还想考虑在主代码之外创建一个空白变量数据__init__,然后调用classinstance.data = classinstance.query_database()


推荐阅读