如何在Python中对执行SQL而不影响db的函数进行单元测试?

2024-10-04 11:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力对一个不返回任何内容并执行删除操作的函数进行单元测试。功能如下:

    def removeReportParseData(self, report_id, conn=None):
        table_id = dbFind(
            "select table_id from table_table where report_id=%s", (report_id), conn
        )
        for t in table_id:
            self.removeTableParseData(int(t["table_id"]), conn)
            dbUpdate("delete from table_table where table_id=%s", t["table_id"], conn)

我想确保命令已经执行,但不想影响实际的数据库。我目前的代码是:

    def test_remove_report_parse_data(self):
        with patch("com.pdfgather.GlobalHelper.dbFind") as mocked_find:
            mocked_find.return_value = [123, 232, 431]
            mocked_find.assert_called_once()

提前感谢您的支持


Tags: 函数fromselfreport功能id内容def
1条回答
网友
1楼 · 发布于 2024-10-04 11:30:41

我不相信不执行SQL就可以执行SQL,可以这么说,但是如果您使用的是MySQL,那么通过将查询包装在START TRANSACTION;ROLLBACK;中,您可能会非常接近您想要的内容

即,您可以将查询替换为:

START TRANSACTION;
YOUR QUERY HERE;
ROLLBACK

这将证明您的函数在不实际更改数据库内容的情况下工作

但是,如果只测试这些函数是否可以执行任何查询就足够了,您也可以选择使用空查询来测试它们,并简单地断言dbFind和dbUpdate方法的调用次数与您预期的一样多

不过,正如我在评论中提到的,我强烈建议不要让您的测试套件与开发数据库交互

虽然在为测试设置另一个数据库时肯定会涉及一些配置,但您应该能够找到一些样板代码来轻松地完成这项工作,因为这是非常常见的做法

相关问题 更多 >