If you write a lot of unit tests in python, especially on complex pieces of software, no doubt you have come across python’s mock module. As of writing this, I just noticed that it has now been pulled into the python standard library unittest module

It is easy to use mock to mock class-level instance methods:

class ClassA(object):

    def hello(self):
        return "Hello"
    

And now in some unit test

class Test(TestCase):
    
    @mock.patch('classA.hello', mock.Mock(return_value="world"))
    def test_class(self):
        cls = ClassA()
        cls.hello()
            

That was easy enough, but mocking module level functions is actually not as easy. Lets say I have some module called name_utis.py that’s sole job is to concatenate first name and last name:

// name_utils.py

def make_whole_name(first, last):
    return "{} {}"format(first, last)

And lets say this function is called by some other class:

class ClassB(object):
    
    def __init__(self, first, last):
        self.first = first
        self.last = last

    def get_name(self):
        return make_whole_name(self.first, self.last)
        

My goal is to mock make_whole_name, not get_name. This can be done by using the following

class Test(TestCase):
    
    @mock.patch('path.to.make_whole_name.make_whole_name')
    def test_class(self, first_name, last_name):
        
        dhs.first_name = 'joseph'
        dhs.last_name = 'misiti'
        
        cls = ClassB('hello','world')
        self.assertEquals(cls.get_name(), 'joseph misiti')