unittest.mock: утверждение частичного совпадения для аргумента метода

Rubyist пишет Python здесь. У меня есть некоторый код, который выглядит примерно так:

result = database.Query('complicated sql with an id: %s' % id)

database.Query макетируется, и я хочу проверить, правильно ли вводится идентификатор, без жесткого кодирования всего оператора 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])

Лучшие идеи?

38
задан jpatokal 9 July 2019 в 03:18
поделиться