Rubyist Pythonをここに書く。私はちょっとこのようになりますいくつかのコード持っている:unittest.mock:メソッド引数の部分一致をアサートする
result = database.Query('complicated sql with an id: %s' % id)
database.Query
を嘲笑し、私はIDが私のテストにSQL文全体をハードコーディングすることなく、正確に注入されることをテストしたいです。ルビー/ RRで、私はこの行っているでしょう:
mock(database).query(/#{id}/)
をしかし、私は、少なくともいくつかの毛深いside_effect
ロジックを使用せず、unittest.mockでそのような「選択的なモック」を設定する方法を参照することはできません。だから、代わりにアサーションで正規表現を使ってみました:
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])
良いアイデア?
悪くない...しかし、モックを設定する方法はありますか?あとでアサートするのではなく、あらかじめ一致する文字列が必要ですか? – jpatokal
@jpatokalは、別のバージョンを追加しました。 – falsetru
あなたの新しいバージョンのように見えるのは、効果的にあなた自身の実装の模擬ですか?それは必ずしも間違っているわけではないが、私はunittest.mockがこのようなことをしていないことに驚いている。 – jpatokal