3

予想される呼び出しのリストが実際に行われた呼び出しと等しいことを確認できるように、 mock_calls の例を再作成しようとしています。ただし、次のNameError理由で例外が発生しname 'call' is not definedます。

>>> 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予想される呼び出しのリストを同じ順序で確認する適切な方法と同じですか?

編集:

これは、属性_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))
4

1 に答える 1

5

私はこのライブラリを使用していませんが、エラーはかなり一般的です。基本的に、最初に定義されていない属性を使用しようとしていることを意味します。属性はモックのドキュメントで参照されていたので、call使用するためにプログラムにインポートする必要があるのは、(「MagicMock」の定義に加えて) モック ライブラリによって定義されたものであると仮定しました。これはかなり一般的なことです。通常、ライブラリは単一の属性ですべてを定義することはできません。すべてを機能させるには、複数の属性をインポートする必要がある場合があります。

モック ドキュメントを参照すると、実際にcallメソッドがあることがわかりました。callしたがって、メソッドもスクリプトにインポートする必要があります。最初の行を次のように変更します...

from mock import MagicMock, call

ここで、MagicMock 属性だけでなく call 属性もインポートしています。

于 2013-02-24T07:45:23.753 に答える