DEV Community

Cover image for How to test method call order with unittest in Python
pikoTutorial
pikoTutorial

Posted on • Originally published at pikotutorial.com

How to test method call order with unittest in Python

Welcome to the next pikoTutorial !

Sometimes when writing unit test it is necessary to check not only if certain function has been called, but also the order in which functions have been called. To do that with unittest in Python, use the following code:

import unittest
from unittest.mock import MagicMock, call
# function to be tested
def function(obj):
    obj.say_hello()
    obj.say_goodbye()
# unit test
class TestFunctionCallOrder(unittest.TestCase):
    def test_function_call_order(self):
        # create a mock object
        mock_obj = MagicMock()
        # call the function with the mock object
        function(mock_obj)
        # define the expected call order
        expected_calls = [call.say_hello(), call.say_goodbye()]
        # check if the actual call order matches the expected call order
        mock_obj.assert_has_calls(expected_calls)
Enter fullscreen mode Exit fullscreen mode

If you change the order of function calls, e.g. like this:

def function(obj):
    obj.say_goodbye()
    obj.say_hello()
Enter fullscreen mode Exit fullscreen mode

The above test will immediately catch such regression:

AssertionError: Calls not found.
Expected: [call.say_hello(), call.say_goodbye()]
  Actual: [call.say_goodbye(), call.say_hello()]
Enter fullscreen mode Exit fullscreen mode

Top comments (0)