This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: _mock_call does not properly grab args and kwargs
Type: behavior Stage:
Components: macOS Versions: Python 3.6, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: michael.foord, paetling, rbcollins
Priority: normal Keywords:

Created on 2015-09-04 12:25 by paetling, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg249757 - (view) Author: Alex Etling (paetling) Date: 2015-09-04 12:25
Consider the following lines of code:

def test_mock(val):
    fake_mock = Mock()
    a = {}  
    fake_mock.func(a)
    a['val'] = 5
    fake_mock.func.assert_has_calls([call({})])
What i would expect would be for this statement to pass. What I actually see is the following:

Traceback (most recent call last):
File "/gc/gclib/python/tests/kafka_production/encoding_test.py", line 121, in test_mock
fake_mock.func.assert_has_calls([call({})])
File "/usr/local/lib/python2.7/dist-packages/mock.py", line 863, in assert_has_calls
'Actual: %r' % (calls, self.mock_calls)
AssertionError: Calls not found.
Expected: [call({})]
Actual: [call({'val': 5})]
Mock thinks that I have passed in {'val': 5}, when I in fact did pass in {}. The errors seems to be the way args and kwargs are being grabbed in _mock_call function
msg249758 - (view) Author: Alex Etling (paetling) Date: 2015-09-04 12:28
I attempted to fix this by just deepcopying on creation of the _call object, on line 927 of mock.py but this caused a lot of strange errors I did not expect.  If you could advise on how best to proceed to fix, I would greatly appreciate it.
msg250210 - (view) Author: Michael Foord (michael.foord) * (Python committer) Date: 2015-09-08 14:29
This is actually the specified and documented behaviour of mock when it is passed mutable arguments. Deep copying arguments on calls is rife with potential problems (not everything can be copied and it breaks comparison by identity). The documentation suggests ways around this:

https://docs.python.org/3/library/unittest.mock-examples.html#coping-with-mutable-arguments
History
Date User Action Args
2022-04-11 14:58:20adminsetgithub: 69188
2015-09-08 14:29:21michael.foordsetstatus: open -> closed
resolution: not a bug
messages: + msg250210
2015-09-04 15:51:57ned.deilysetnosy: + rbcollins, michael.foord, - ronaldoussoren, ned.deily
versions: - Python 3.2, Python 3.3
2015-09-04 12:28:52paetlingsetmessages: + msg249758
2015-09-04 12:25:41paetlingcreate