2

I am trying to learn unittest patching. I have a single file that both defines a function, then later uses that function. When I try to patch this function, its return value is giving me the real return value, not the patched return value.

How do I patch a function that is both defined and used in the same file? Note: I did try to follow the advice given here, but it didn't seem to solve my problem.

walk_dir.py


    from os.path import dirname, join
    from os import walk
    from json import load


    def get_config():
        current_path =dirname(__file__)
        with open(join(current_path, 'config', 'json', 'folder.json')) as json_file:
            json_data = load(json_file)

        return json_data['parent_dir'] 

    def get_all_folders():
        dir_to_walk = get_config()
        for root, dir, _ in walk(dir_to_walk):
            return [join(root, name) for name in dir]

test_walk_dir.py


    from hello_world.walk_dir import get_all_folders
    from unittest.mock import patch


    @patch('walk_dir.get_config')
    def test_get_all_folders(mock_get_config):
        mock_get_config.return_value = 'C:\\temp\\test\\'
        result = get_all_folders()
        assert set(result) == set('C:\\temp\\test\\test_walk_dir')

dKK
  • 23
  • 3

1 Answers1

2

Try declaring the patch in such way:

@patch('hello_world.walk_dir.get_config')

As you can see this answer to the question you linked, it's recommended that your import statements match your patch statements. In your case from hello_world.walk_dir import get_all_folders and @patch('walk_dir.get_config') doesn't match.

sanyassh
  • 8,100
  • 13
  • 36
  • 70