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 🙂