私はエントリポイント関数は、オブジェクト上の他のいくつかのメソッドを呼び出しますから、私はunmocked残るしたいオブジェクトにmain
それを呼び出す必要があり:どのようにしてオブジェクトを修正し、すべてのメソッドが1つを除いたモックされるようにしますか?
class Thing(object):
def main(self):
self.alpha()
self.bravo()
def alpha(self):
self.charlie()
def bravo(self):
raise TypeError("Requires Internet connection!")
def charlie(self):
raise Exception("Bad stuff happens here!")
を。これは、手動でモックにはかなり簡単です:
thing = Thing()
thing.alpha = MagicMock()
thing.bravo = MagicMock()
そして私は、私は彼らが、扱っていることを確認するアルファとブラボーで副作用を設定することができ、アルファとブラボーの両方が一度呼ばれていることを確認するためにテストすることができますなどなど私は何
アボを心配utは、コード定義が変更され、誰かがmain
にcharlie
コールを追加した場合です。それは嘲笑されていないので、今は副作用が感じられるでしょう(そして、ファイルへの書き込み、データベースへの接続、インターネットからのものの取り出しなど)、単純な例外はテストが今であることを警告しません悪い)。
私のモックオブジェクトは、私が言うべきもの以外の方法を呼んでいないことを確認することでした(あるいはテスト例外を発生させる)。私がしなければしかし、このような何か:それは他のメソッドを呼び出していないので、
MockThing = create_autospec(Thing)
thing = Thing()
thing.main()
print thing.method_calls
# [calls.main()]
その後main
も嘲笑されます。どのように私はすべての方法しかし、メインの方法をモックできますか? (私はmethod_callsを[calls.alpha(), calls.bravo()]
にしたいと思います)。
編集:ハッキングはまあ
を回答については、私は本当にハック解決策を持っているが、私はこれよりも良い答えはそこにあると思います。基本的に私は、元のクラス(Python bind an unbound method)
MockThing = create_autospec(Thing)
thing = MockThing()
thing.main = Thing.ingest.__get__(thing, Thing)
thing.main()
print thing.method_calls
# [calls.alpha(), calls.bravo()]
からメソッドを再バインドしかし、機能記述子を使用するよりも簡単な解決策が存在しなければなりません!
「オブジェクトには属性「取り込み」がありません」というエラーが表示されます。私はPython 2.7を使用しています –