如何使mock-0.6返回一系列值?

Chr*_*s R 3 python mocking

我正在使用来自http://www.voidspace.org.uk/python/mock/mock.html的mock-0.6库来模拟测试框架,我希望有一个模拟方法返回一系列值,每次被召唤.

现在,这是我认为应该工作的:

def returnList(items):
  def sideEffect(*args, **kwargs):
    for item in items:
      yield item
    yield mock.DEFAULT
  return sideEffect

mock = Mock(side_effect=returnList(aListOfValues))
values = mock()
log.info("Got %s", values)
Run Code Online (Sandbox Code Playgroud)

日志输出是这样的:

subsys: INFO: Got <generator object func at 0x1021db500> 
Run Code Online (Sandbox Code Playgroud)

因此,副作用是返回生成器,而不是下一个值,这似乎是错误的.我在哪里弄错了?

sla*_*acy 6

如果您只想返回值列表,如果您使用mock == 0.8.0或更高版本,答案很简单:

import mock 

m = mock.Mock() 
m = side_effect = [ 
    ['a', 'b', 'c'], 
    ['d', 'e', 'f'], 
] 

print "First: %s" % m() 
print "Second: %s" % m() 
Run Code Online (Sandbox Code Playgroud)

输出是:

First: ['a', 'b', 'c']
Second: ['d', 'e', 'f']
Run Code Online (Sandbox Code Playgroud)

如果您每次都想要相同的确切返回值,那么答案就更简单了:

m = mock.Mock() 
m.return_value = ['a', 'b', 'c']
print m('foo') 
print m('bar') 
print m('baz') 
Run Code Online (Sandbox Code Playgroud)