2016-03-22 8 views
5

Ich habe durch die Seite https://docs.python.org/3/library/unittest.mock-examples.html gegangen und ich sehe, dass sie ein Beispiel auf aufgeführt haben, wie Generatoren verspottenWie verspotten Generatoren mit mock.patch

Ich habe einen Code, wo ich einen Generator rufen Sie mich an einen Satz geben von Werten, die ich als ein Wörterbuch speichere. Ich möchte die Aufrufe dieses Generators in meinem Komponententest verspotten.

Ich habe den folgenden Code geschrieben und es funktioniert nicht.

Wohin gehe ich falsch?

In [7]: items = [(1,'a'),(2,'a'),(3,'a')] 

In [18]: def f(): 
    print "here" 
    for i in [1,2,3]: 
     yield i,'a' 

In [8]: def call_f(): 
    ...:  my_dict = dict(f()) 
    ...:  print my_dict[1] 
    ...: 

In [9]: call_f() 
"here" 
a 

In [10]: import mock 


In [18]: def test_call_f(): 
    with mock.patch('__main__.f') as mock_f: 
     mock_f.iter.return_value = items 
     call_f() 
    ....: 

In [19]: test_call_f() 
--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-19-33ca65a4f3eb> in <module>() 
----> 1 test_call_f() 

<ipython-input-18-92ff5f1363c8> in test_call_f() 
     2  with mock.patch('__main__.f') as mock_f: 
     3   mock_f.iter.return_value = items 
----> 4   call_f() 

<ipython-input-8-a5cff08ebf69> in call_f() 
     1 def call_f(): 
     2  my_dict = dict(f()) 
----> 3  print my_dict[1] 

KeyError: 1 

Antwort

6

Ändern Sie diese Zeile:

mock_f.iter.return_value = items 

Um dies:

mock_f.return_value = iter(items)