Как я могу заставить mock-0.6 возвращать последовательность значений? - PullRequest
3 голосов
/ 26 марта 2010

Я использую библиотеку mock-0.6 из http://www.voidspace.org.uk/python/mock/mock.html, чтобы смоделировать среду для тестирования, и я хочу, чтобы метод mock возвращал серию значений, каждый раз, когда он вызывается.

Прямо сейчас, это то, что я решил, должно работать:

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> 

Итак, побочный эффект возвращает генератор, а не следующее значение, что кажется неправильным. Где я ошибаюсь?

Ответы [ 2 ]

6 голосов
/ 11 августа 2012

Если вы просто хотите вернуть список значений, ответ прост, если вы используете 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') 
2 голосов
/ 26 марта 2010

Вот решение, найденное методом проб и ошибок:

Функция 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...