How Mock can help you write faster tests

Today I had a pretty annoying programming problem: I had to test a function that was calling another function which took a really long time, “csp_solver”.

def wrapper_fn(one, two=None):
    if not two:
        return csp_solver(one=one)

So at first I wrote

from unittest import TestCase


class TestWrapperFn(TestCase):
    def test_csp_solver_is_called(self):
        result = wrapper_fn(one=1)
        self.assertEqual(result, 2)

The problem itself was solvable but the annoying thing was that every time I changed one line I had to rerun the whole thing and that tool forever.

csp_solver is a very slow external library. I already wrote a lot of tests for the underlying function so today I just had to make sure the calling function worked.
To do that I remembered “unittest.mock”. With mocks I can temporarily override functions that I don’t need right now and test the environment.

I just want to test that csp_solver is called during the operation and with the correct parameters so it can be patch for our scenario here:

from unittest import TestCase
from mock import patch


class TestWrapperFn(TestCase):
    @patch('csp_solver')
    def test_csp_solver_is_called(self, csp_solver_mock):
        self.assertFalse(csp_solver_mock.called)
        csp_solver_mock.return_value = 2
        result = wrapper_fn(one=1)
        self.assertEqual(result, 2)
        self.assertTrue(csp_solver_mock.called)

This small trick allowed me to improve test execution speed significantly which allowed me to focus on the problem not debugging it, great! Hope this trick saves you some time 🙂