このページを確認しました https://docs.python.org/3/library/unittest.mock-examples.html ジェネレーターをモックする方法の例がリストされていることがわかります
ジェネレーターを呼び出して、辞書として保存する値のセットを取得するコードがあります。ユニットテストでこのジェネレーターへの呼び出しをモックしたいと思います。
次のコードを記述しましたが、機能しません。
どこが間違っているのですか?
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
この行を変更します。
mock_f.iter.return_value = items
これに:
mock_f.return_value = iter(items)