我正在努力单元测试一个不返回任何内容并执行删除操作的函数。这个函数如下。
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,可以这么说,但是如果你是在MySQL上,你也许可以通过将你的查询包装成相当接近你想要的东西 START TRANSACTION;
和 ROLLBACK;
也就是说,你可以将你的查询替换为。
START TRANSACTION;
YOUR QUERY HERE;
ROLLBACK
这将证明你的函数是有效的,而不实际改变数据库的内容。
然而,如果只需要简单的测试这些函数执行任何查询就足够了,你可以选择用空查询来测试它们,并简单的断言你的dbFind和dbUpdate方法被调用的次数和你期望的一样多。
再次强调,正如我在评论中提到的,我强烈建议不要让测试套件与开发数据库交互。
虽然在为测试设置另一个数据库的过程中肯定会涉及到一些配置,但你应该可以很容易地找到一些模板代码来实现这一点,因为这是非常普遍的做法。