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
: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)

View File

@ -161,6 +161,18 @@ telnetlib
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
------------------

View File

@ -772,6 +772,24 @@ class NonCallableMock(Base):
(self._mock_name or 'mock', self.call_count))
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):
"""assert that the mock was called with the specified arguments.

View File

@ -1222,6 +1222,27 @@ class MockTest(unittest.TestCase):
with self.assertRaises(AssertionError):
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
def test_sorted_call_signature(self):
m = Mock()

View File

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

View File

@ -201,6 +201,9 @@ Core and Builtins
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
NotImplementedError instead of ImportError.