簡體   English   中英

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

[英]How can I make mock-0.6 return a sequence of values?

我正在使用來自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)

日志輸出是這樣的:

subsys: INFO: Got <generator object func at 0x1021db500> 

因此,副作用是返回生成器,而不是下一個值,這似乎是錯誤的。 我在哪里弄錯了?

如果您只想返回值列表,如果您使用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() 

輸出是:

First: ['a', 'b', 'c']
Second: ['d', 'e', 'f']

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

m = mock.Mock() 
m.return_value = ['a', 'b', 'c']
print m('foo') 
print m('bar') 
print m('baz') 

這是通過反復試驗找到的解決方案:

returnList函數必須創建一個生成器並使用其next方法來提供響應:

def returnList(items):
  log.debug("Creating side effect function for %s", items)
  def func():
    for item in items:
      log.debug("side effect yielding %s", item)
      yield item
    yield mock.DEFAULT

  generator = func()

  def effect(*args, **kwargs):
    return generator.next()

  return effect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM