external_module.py
def multiply(x, y):
return x*y+1
main.py
import unittest
from unittest import mock
from unittest.mock import patch
#### pay attention to the way we import 'multiply'
### in the following way, we import multiply by 'external_module.multiply'.
import external_module
#we can't use the format "from external_module import multiply".
#Since in this way you can import multiply, but it can't be mocked.
#@patch('external_module.multiply') only mock the place where we use 'external_module.multiply'
def add_and_multiply(x, y):
addition = x + y
multiple = external_module.multiply(x, y)
return addition, multiple
class Count():
def add(self, x, y):
return x+y
class TestCount(unittest.TestCase):
def test_add_returnvalue(self):
count = Count()
count.add = mock.Mock(return_value=13)
result = count.add(6, 7)
self.assertEqual(result, 13)
def test_add_sideeffect(self):
count = Count()
count.add = mock.Mock(return_value=13, side_effect=count.add)
result = count.add(6, 6)
self.assertEqual(result, 12)
@patch('external_module.multiply')
def test_add_and_multiply2(self, mock_multiply):
x = 3
y = 5
mock_multiply.return_value = 15
addition, mul = add_and_multiply(x, y)
mock_multiply.assert_called_once_with(3, 5)
self.assertEqual(8, addition)
self.assertEqual(15, mul)
if __name__ == "__main__":
unittest.main()