私はunittest.mock
、この素晴らしいライブラリを使用しています。しかし、私は予想外の動作に驚いていました。明らかな解決策はありません。私は単体テストのためにそれを使用しています。そして、それが役に立つテストをする方法を完全に理解することは非常に重要です。mocking時にインスタンスのメソッドが "self"で呼び出されたかどうかをテストするには?
show_bar
のコードが壊れていることを知っています。インスタンスメソッドの代わりにclassmethodを呼び出しています。しかし、すべての私のmock
ユニットテストを渡している:
class Foo(object):
def bar(self):
return "bar"
def show_bar(self):
return Foo.bar()
予想される使用:
foo = Foo()
assert foo.show_bar() == "bar"
# => throw exception: bar() missing 1 required positional argument: 'self'
ユニットテストはしてこのエラーをキャッチしようとして失敗し
コードはバグを含みますmock
:
from unittest.mock import patch
with patch.object(Foo, 'bar', return_value="bar") as mock:
foo = Foo()
assert foo.show_bar() == "bar"
mock.assert_called_once()
# => no errors
理想的には、私はbar
がself.bar()
と呼ばおよびNOT Foo.bar()
さことを主張したいと思います。それは間違っている。残念ながら、mock.assert_called_with()
を使用しても、self
でもcls
というパラメータも考慮されていないため、少し混乱します。
EDIT:明確化しようとしています。私はオブジェクトのメソッドにパッチを当てる必要があるときにライブラリunittest.mock
を使用するベストプラクティスを探しています。パッチを当てる方法がわからないようですが、現在はself.bar
またはFoo.bar
を呼び出していると主張する方法はありません。
を何かを嘲笑しないで、単に 'F =はFoo()を呼び出します。 f.bar() 'をテストコードに追加します。壊れた実装では 'TypeError'が発生し、テストは失敗します。 –
また、FWIW、これは 'classmethod'とは関係がありません。あなたの例では、' Foo.bar'はバインドされていないインスタンスメソッドです。 –
申し訳ありませんが、コードは単純化されており、メソッドの実際のコードはその戻り値を嘲笑せずに呼び出すことができないので、mockを使用する必要があります。また、 'show_bar'開発者が' Foo.bar() 'を呼び出すとき、私は' Foo.bar'がclassmethodかstaticmethodのいずれかであると仮定していました。それは合理的な陳述のようですか? – Doomsday