[TIP] Using Mock to patch an iterator / generator?
michael at voidspace.org.uk
Sat Jun 11 02:35:14 PDT 2011
On 10/06/2011 00:08, Andrew Hammond wrote:
> I have a class that looks like
> class Foo(object):
> def iter(descending=False):
> for r in something_iterable:
> yield r
Because of the use of yield, your iter is a generator and not a normal
method. Mocking a generator (or any iterable) can be done with the
MagicMock (in mock 0.7).
You can then configure the return values using something similar to this:
mock = MagicMock()
values = [1, 2, 3]
mock.iter.__iter__.side_effect = lambda: values.pop()
All the best,
> I would like to mock the class and patch Foo.iter. I have tried a
> number of things without luck.
> class TestFoo(PatchedTestCase):
> _partitions = 
> def partitions(self):
> for p in self._partitions:
> yield p
> def postSetUpPreRun(self):
> self._partitions = [ 1, 2, 3, 4 ]
> rw = Mock(spec=Foo)
> self.mock_RollingWindow = rw
> rw.iter = Mock()
> rw.iter.side_effect = self.partitions
> This is following the pattern I've used for other methods, but doesn't
> work for an iterator... so, what is the proper approach please?
> testing-in-python mailing list
> testing-in-python at lists.idyll.org
May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessinghttp://www.sqlite.org/different.html
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the testing-in-python