2017-08-03 6 views
2

this questionと似ていますが、そこの回答は私がやっていることには十分ではありません。forループの模擬イテレータをリセットするには?

私はこのようなメソッドをテストしようとしている

import mock 


def stack_overflow_desired_output(): 
    print_a_few_times(['upvote', 'this', 'question!']) 


def stack_overflow_mocked(): 
    the_mock = mock.Mock() 
    the_mock.__iter__ = mock.Mock(return_value=iter(["upvote", "this", "question"])) 
    print_a_few_times(the_mock) 


def print_a_few_times(fancy_object): 
    for x in [1, 2, 3]: 
     for y in fancy_object: 
      print("{}.{}".format(x, y)) 

私はこの取得stack_overflow_desired_output()を呼び出すとき:

1.upvote 
1.this 
1.question! 
2.upvote 
2.this 
2.question! 
3.upvote 
3.this 
3.question! 

しかし、私はstack_overflow_mocked()を呼び出すときに、私はこれだけゲット:

1.upvote 
1.this 
1.question! 

イテレータは、その時点で使い果たされたときにそれ自体をリセットする方法はありますか? forループの終わり? print_a_few_timesの内部にリセットを置くと、機能、は侵襲的になります。

答えて

1

モックオブジェクトを実際のリストの__iter__メソッドで囲みます。

def stack_overflow_mocked(): 
    the_mock = mock.Mock() 
    the_mock.__iter__ = mock.Mock(wraps=["upvote", "this", "question"].__iter__) 
    print_a_few_times(the_mock) 
+0

これを行いました。あなたは揺れる – TinyTheBrontosaurus