Rubyist 在这里编写 Python。我有一些看起来像这样的代码:
result = database.Query('complicated sql with an id: %s' % id)
database.Query
被模拟出来,我想测试 ID 是否被正确注入,而不会将整个 SQL 语句硬编码到我的测试中。在 Ruby/RR 中,我会这样做:
mock(database).query(/#{id}/)
但是我看不到在 unittest.mock 中设置像这样的“选择性模拟”的方法,至少没有一些毛茸茸的side_effect
逻辑。所以我尝试在断言中使用正则表达式:
with patch(database) as MockDatabase:
instance = MockDatabase.return_value
...
instance.Query.assert_called_once_with(re.compile("%s" % id))
但这也行不通。这种方法确实有效,但很难看:
with patch(database) as MockDatabase:
instance = MockDatabase.return_value
...
self.assertIn(id, instance.Query.call_args[0][0])
更好的想法?