Add Mock.assert_called()

Issue #26323: Add assert_called() and assert_called_once() methods to
unittest.mock.Mock.
This commit is contained in:
Victor Stinner 2016-03-11 22:17:48 +01:00
parent 82442b7022
commit 2c2a4e63d7
6 changed files with 83 additions and 0 deletions

View File

@ -259,6 +259,34 @@ the *new_callable* argument to :func:`patch`.
used to set attributes on the mock after it is created. See the used to set attributes on the mock after it is created. See the
:meth:`configure_mock` method for details. :meth:`configure_mock` method for details.
.. method:: assert_called(*args, **kwargs)
Assert that the mock was called at least once.
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called()
.. versionadded:: 3.6
.. method:: assert_called_once(*args, **kwargs)
Assert that the mock was called exactly once.
>>> mock = Mock()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_once()
>>> mock.method()
<Mock name='mock.method()' id='...'>
>>> mock.method.assert_called_once()
Traceback (most recent call last):
...
AssertionError: Expected 'method' to have been called once. Called 2 times.
.. versionadded:: 3.6
.. method:: assert_called_with(*args, **kwargs) .. method:: assert_called_with(*args, **kwargs)

View File

@ -161,6 +161,18 @@ telnetlib
Stéphane Wirtel in :issue:`25485`). Stéphane Wirtel in :issue:`25485`).
unittest.mock
-------------
The :class:`~unittest.mock.Mock` class has the following improvements:
* Two new methods, :meth:`Mock.assert_called()
<unittest.mock.Mock.assert_called>` and :meth:`Mock.assert_called_once()
<unittest.mock.Mock.assert_called_once>` to check if the mock object
was called.
(Contributed by Amit Saha in :issue:`26323`.)
urllib.robotparser urllib.robotparser
------------------ ------------------

View File

@ -772,6 +772,24 @@ class NonCallableMock(Base):
(self._mock_name or 'mock', self.call_count)) (self._mock_name or 'mock', self.call_count))
raise AssertionError(msg) raise AssertionError(msg)
def assert_called(_mock_self):
"""assert that the mock was called at least once
"""
self = _mock_self
if self.call_count == 0:
msg = ("Expected '%s' to have been called." %
self._mock_name or 'mock')
raise AssertionError(msg)
def assert_called_once(_mock_self):
"""assert that the mock was called only once.
"""
self = _mock_self
if not self.call_count == 1:
msg = ("Expected '%s' to have been called once. Called %s times." %
(self._mock_name or 'mock', self.call_count))
raise AssertionError(msg)
def assert_called_with(_mock_self, *args, **kwargs): def assert_called_with(_mock_self, *args, **kwargs):
"""assert that the mock was called with the specified arguments. """assert that the mock was called with the specified arguments.

View File

@ -1222,6 +1222,27 @@ class MockTest(unittest.TestCase):
with self.assertRaises(AssertionError): with self.assertRaises(AssertionError):
m.hello.assert_not_called() m.hello.assert_not_called()
def test_assert_called(self):
m = Mock()
with self.assertRaises(AssertionError):
m.hello.assert_called()
m.hello()
m.hello.assert_called()
m.hello()
m.hello.assert_called()
def test_assert_called_once(self):
m = Mock()
with self.assertRaises(AssertionError):
m.hello.assert_called_once()
m.hello()
m.hello.assert_called_once()
m.hello()
with self.assertRaises(AssertionError):
m.hello.assert_called_once()
#Issue21256 printout of keyword args should be in deterministic order #Issue21256 printout of keyword args should be in deterministic order
def test_sorted_call_signature(self): def test_sorted_call_signature(self):
m = Mock() m = Mock()

View File

@ -1267,6 +1267,7 @@ Bernt Røskar Brenna
Constantina S. Constantina S.
Patrick Sabin Patrick Sabin
Sébastien Sablé Sébastien Sablé
Amit Saha
Suman Saha Suman Saha
Hajime Saitou Hajime Saitou
George Sakkis George Sakkis

View File

@ -201,6 +201,9 @@ Core and Builtins
Library Library
------- -------
- Issue #26323: Add Mock.assert_called() and Mock.assert_called_once()
methods to unittest.mock. Patch written by Amit Saha.
- Issue #20589: Invoking Path.owner() and Path.group() on Windows now raise - Issue #20589: Invoking Path.owner() and Path.group() on Windows now raise
NotImplementedError instead of ImportError. NotImplementedError instead of ImportError.