2017-09-19 5 views
0

私は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 

理想的には、私はbarself.bar()と呼ばおよびNOT Foo.bar()ことを主張したいと思います。それは間違っている。残念ながら、mock.assert_called_with()を使用しても、selfでもclsというパラメータも考慮されていないため、少し混乱します。

EDIT:明確化しようとしています。私はオブジェクトのメソッドにパッチを当てる必要があるときにライブラリunittest.mockを使用するベストプラクティスを探しています。パッチを当てる方法がわからないようですが、現在はself.barまたはFoo.barを呼び出していると主張する方法はありません。

+0

を何かを嘲笑しないで、単に 'F =はFoo()を呼び出します。 f.bar() 'をテストコードに追加します。壊れた実装では 'TypeError'が発生し、テストは失敗します。 –

+0

また、FWIW、これは 'classmethod'とは関係がありません。あなたの例では、' Foo.bar'はバインドされていないインスタンスメソッドです。 –

+0

申し訳ありませんが、コードは単純化されており、メソッドの実際のコードはその戻り値を嘲笑せずに呼び出すことができないので、mockを使用する必要があります。また、 'show_bar'開発者が' Foo.bar() 'を呼び出すとき、私は' Foo.bar'がclassmethodかstaticmethodのいずれかであると仮定していました。それは合理的な陳述のようですか? – Doomsday

答えて

1

私は実際に呼び出されたときにTypeErrorを発生させないことをテストするためにメソッドをモックする必要があるのは分かりません...他の人がunittest.mockを使用して解決する方法を説明するかもしれません。ただ自分でunittest.mockとモックFoo.barをスキップすることができます

callargs = dict() 
def mock_bar(self): 
    callargs["self"] = self 
    return "bar" 

foobar = Foo.__dict__["bar"] 
Foo.bar = mock_bar 
try: 
    foo = Foo() 
    assert foo.show_bar() == "bar" 
    assert "self" in callargs 
    assert callargs["self"] is foo 
finally: 
    Foo.bar = foobar 
+0

実際には私の問題を修正しようとしているわけではなく、 "手動で"自分のクラスを嘲笑するのではなく、unittestingのメソッド呼び出しを正しく置き換えるために 'unittest.mock'コンテキスト。しかし、助けてくれてありがとう! – Doomsday

関連する問題