1

シェルで実行するかプログラムで実行するかによって、mock.mock_calls の内容が異なるのはなぜですか? のアサーションはmock.mock_calls == expectedプログラムでは失敗しますが、シェルではパスします。このコードは、複数の通話を追跡するためのドキュメントに基づいています。(26.5.1.5. すべての通話の追跡)

>>> from unittest.mock import MagicMock, call
>>> mock = MagicMock()
>>> mock.method()
<MagicMock name='mock.method()' id='57725952'>
>>> mock.attribute.method(10, x=53)
<MagicMock name='mock.attribute.method()' id='57775944'>
>>> mock.mock_calls
[call.method(), call.attribute.method(10, x=53)]
>>> mock.method_calls
[call.method(), call.attribute.method(10, x=53)]
>>> expected = [call.method(), call.attribute.method(10, x=53)]
>>> expected == mock.mock_calls
True
>>> expected == mock.method_calls
True

これまでのところ、すべて正確に予想どおりです。しかし、プログラムで何が起こっているかを見てください。呼び出されたすべてのメソッドのメソッドmock.mock_callsへの追加の呼び出しが記録されます。__str__mock.method_calls は影響を受けません。

import unittest.mock
mock = unittest.mock.MagicMock()
print(mock.method())
print(mock.attribute.method(10, x=53))
print('\nmock.mock_calls\n', mock.mock_calls)
print('\nmock.method_calls\n', mock.method_calls)

expected = [unittest.mock.call.method(),
            unittest.mock.call.attribute.method(10, x=53)]
print(expected == mock.mock_calls)
print(expected == mock.method_calls)

出力:

<MagicMock name='mock.method()' id='45740272'>
<MagicMock name='mock.attribute.method()' id='45850128'>

mock.mock_calls
 [call.method(),
 call.method().__str__(),
 call.attribute.method(10, x=53),
 call.attribute.method().__str__()]

mock.method_calls
 [call.method(), call.attribute.method(10, x=53)]
False
True

Windows 7 コンピューターで Python 3.4 を実行しています。

4

1 に答える 1