2013-02-24 2 views
1

Я пытаюсь воссоздать mock_calls example, чтобы я мог проверить, что ожидаемый список вызовов равен фактическим выполненным вызовам. Тем не менее, Я получаю NameError исключения, потому что name 'call' is not defined:Утверждение `mock_calls` равно ожидаемому списку вызовов

>>> from mock import MagicMock 
>>> mock = MagicMock() 
>>> result = mock(1, 2, 3) 
>>> mock.first(a=3) 
<MagicMock name='mock.first()' id='47645192'> 
>>> mock.second() 
<MagicMock name='mock.second()' id='47653440'> 
>>> int(mock) 
1 
>>> result(1) 
<MagicMock name='mock()()' id='47666064'> 
>>> expected = [call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)] 

Traceback (most recent call last): 
    File "<pyshell#39>", line 1, in <module> 
    expected = [call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)] 
NameError: name 'call' is not defined 

Я попытался определение моей expected переменного как строка вместо того, чтобы, однако это еще не позволяет провести прямое сравнение.

>>> expected = """[call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)]""" 
>>> mock.mock_calls == expected 
False 
>>> mock.mock_calls 
[call(1, 2, 3), call.first(a=3), call.second(), call.__int__(), call()(1)] 

Любые идеи о том, как заставить этот пример работать? Если это так, это то же самое, что и надлежащий способ проверить, что mock_calls имеет ожидаемый список вызовов и в том же порядке?

Edit:

Вот исходный код _CallList класса, который является тип объекта, возвращаемого атрибутом mock_calls.

class _CallList(list): 

    def __contains__(self, value): 
     if not isinstance(value, list): 
      return list.__contains__(self, value) 
     len_value = len(value) 
     len_self = len(self) 
     if len_value > len_self: 
      return False 

     for i in range(0, len_self - len_value + 1): 
      sub_list = self[i:i+len_value] 
      if sub_list == value: 
       return True 
     return False 

    def __repr__(self): 
     return pprint.pformat(list(self)) 

ответ

2

Я не использовал эту библиотеку, но ошибка довольно распространена. Это в основном означает, что вы пытаетесь использовать какой-либо атрибут, не определяя его сначала. Поскольку атрибут call упоминался в макетной документации, я полагал, что это то, что определено библиотекой mock (в дополнение к определению «MagicMock»), которую необходимо импортировать в вашу программу для использования. Это довольно часто, библиотека обычно не может определить все в одном атрибуте, вам может потребоваться импортировать несколько атрибутов, чтобы заставить все это работать.

Просматривая макет документации, я обнаружил, что у нее действительно есть метод call. Поэтому вам необходимо импортировать метод call в свой скрипт. Измените первую строку на ...

from mock import MagicMock, call 

Теперь вы импортируете не только атрибут MagicMock, но и атрибут вызова.

+0

Спасибо! Я тоже пробовал искать метод «call», но не смог найти его в своей усталости. –

Смежные вопросы