unit test & mock

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章