2012-04-12 11 views
5

私はテストスイート(unittestではなくnoseを使用しています)を持っています。テストクラス内のすべてのテストに対して特定の値のシーケンスを返す関数をパッチしたいと思います。簡単な例を使用して私の最初の試みは、あった:Mockを使った関数へのパッチ適用

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

しかし、MagicMockインスタンスは一度だけ作成されるため、副作用が切れたときに第二のテストは失敗します。私は各テストメソッドを別々にパッチすることができますが、実際にはすべてのパッチデコレータを複製する必要はありません(この例よりも多くのテストがあります!)私が行うことができるもう1つの方法は、このようなセットアップコード:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

しかし、元の関数の定義の保存と復元はモックを自動的に行うことができるはず何かのように思えます。私が行方不明になってこれを行う別の方法はありますか?または、私の最後の例がこれを行う最善の方法ですか?アウト

答えて

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

:1

x() 

アウト:2

のリストにあなたの答えを入れてください。 Xを希望の名前に変更します。

+0

私はここで取得しているものは考えています。この質問はまったく関係していないようで、 'x = [1,2] .__ iter __()。next'という複雑な方法のように見えます。何を言おうとしているのですか? – aquavitae

+0

。あなたは、関数のモックを作成する方法が必要です。あなたは今応答の順序を決めます。いいえ? x = ["あなたの最初の応答"、 "2番目のレスポ"、 "... etc"] .__ iter __()。次へ 問題を解決します。 – Nasgar

+0

私はイテレータを作成して関数をモックする方法を知っています。私の質問は、テスト機能ごとにモックをリセットする簡単な方法があるかどうかということでした。 – aquavitae

1

あなただけの代わりに、クラスにそれを適用するのは、すべてのテストにパッチを適用する必要があります

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 
関連する問題