Assert a function/method was not called using Mock
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Lost Meadow
--
Chapters
00:00 Question
00:54 Accepted answer (Score 178)
01:15 Answer 2 (Score 108)
01:39 Answer 3 (Score 37)
01:56 Answer 4 (Score 31)
02:31 Thank you
--
Full question
https://stackoverflow.com/questions/1218...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #unittesting #mocking #pythonmock
#avk47
ACCEPTED ANSWER
Score 188
This should work for your case;
assert not my_var.called, 'method should not have been called'
Sample;
>>> mock=Mock()
>>> mock.a()
<Mock name='mock.a()' id='4349129872'>
>>> assert not mock.b.called, 'b was called and should not have been'
>>> assert not mock.a.called, 'a was called and should not have been'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: a was called and should not have been
ANSWER 2
Score 114
Though an old question, I would like to add that currently mock library (backport of unittest.mock) supports assert_not_called method.
Just upgrade yours;
pip install mock --upgrade
ANSWER 3
Score 32
You can check the called attribute, but if your assertion fails, the next thing you'll want to know is something about the unexpected call, so you may as well arrange for that information to be displayed from the start. Using unittest, you can check the contents of call_args_list instead:
self.assertItemsEqual(my_var.call_args_list, [])
When it fails, it gives a message like this:
AssertionError: Element counts were not equal:
First has 0, Second has 1: call('first argument', 4)
ANSWER 4
Score 20
When you test using class inherits unittest.TestCase you can simply use methods like:
- assertTrue
- assertFalse
- assertEqual
and similar (in python documentation you find the rest).
In your example we can simply assert if mock_method.called property is False, which means that method was not called.
import unittest
from unittest import mock
import my_module
class A(unittest.TestCase):
def setUp(self):
self.message = "Method should not be called. Called {times} times!"
@mock.patch("my_module.method_to_mock")
def test(self, mock_method):
my_module.method_to_mock()
self.assertFalse(mock_method.called,
self.message.format(times=mock_method.call_count))