如何在不影响 Python 中的数据库的情况下对执行 SQL 的函数进行单元测试?



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

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()

提前感谢您的任何支持。

我不相信可以在不执行 SQL 的情况下执行 SQL,可以这么说,但是如果您在 MySQL 上,您可以通过将查询包装在START TRANSACTION;中来接近您想要的内容ROLLBACK;

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

START TRANSACTION;
YOUR QUERY HERE;
ROLLBACK

这将证明您的函数无需实际更改数据库内容即可工作。

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

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

虽然为测试设置另一个数据库肯定涉及一些配置,但您应该能够找到一些样板代码来非常轻松地执行此操作,因为这是非常常见的做法。

最新更新