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

问题描述 投票:0回答:1

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

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

先谢谢你的支持

python unit-testing flask python-unittest
1个回答
0
投票

我不相信可以不执行SQL,可以这么说,但是如果你是在MySQL上,你也许可以通过将你的查询包装成相当接近你想要的东西 START TRANSACTION;ROLLBACK;

也就是说,你可以将你的查询替换为。

START TRANSACTION;
YOUR QUERY HERE;
ROLLBACK

这将证明你的函数是有效的,而不实际改变数据库的内容。

然而,如果只需要简单的测试这些函数执行任何查询就足够了,你可以选择用空查询来测试它们,并简单的断言你的dbFind和dbUpdate方法被调用的次数和你期望的一样多。

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

虽然在为测试设置另一个数据库的过程中肯定会涉及到一些配置,但你应该可以很容易地找到一些模板代码来实现这一点,因为这是非常普遍的做法。

© www.soinside.com 2019 - 2024. All rights reserved.