'Testing two methods in an Azure function in python

I am writing tests for my azure function, and for some reason - I can't mock a function call. I should also mention this is the first time I'm writing a python test case so be nice :)

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')
    try:
        req_body = req.get_json()
    except ValueError as error:
        logging.info(error)
    download_excel(req_body)
    return func.HttpResponse(
            "This HTTP triggered function executed successfully.",
            status_code=200
    )

so thats the initial function. This function calls download_excel and pass the request body. The next function receives the request body, and writes that excel to a blob storage.

def download_excel(request_body: Any):
    excel_file = request_body["items_excel"]

    #initiate the blob storage client
    blob_service_client = BlobServiceClient.from_connection_string(os.environ["AzureWebJobsStorage"])
    container = blob_service_client.get_container_client(CONTAINER_NAME)
    blob_path = "excel-path/items.xlsx"
    blob_client = container.get_blob_client(blob_path)
    blob_client.upload_blob_from_url(excel_file)

Those are the two functions. receive a file, save it to blob storage, but i can't mock the download_excel call in the main function. I've tried using mock, patch, went through all sorts of links, and i just can't find a way to achieve this. Any help would be appreciated. here is what i currently have in the test file.

class TestFunction(unittest.TestCase):
    #@patch('download_excel')
    def get_excel_files_main(self):
        """Test main function"""
        req = Mock()
        resp = main(req)
        # download_excel= MagicMock()
        self.assertEqual(resp.status_code, 200)

commenting out the function call in the function and in the test makes the test pass, but i need to know how to mock the download_excel call. I'm still going to write a test case for the download_excel function, but will cross that bridge when i get to it.



Solution 1:[1]

Figured it out. I'm pretty silly. Main issue was in an azure function, I figured since there was no class I can ignore every example in the doc that had to do with classes.

The trick is to use the function name as a class. so say you have function name - http_trigger, and a init.py file within that function folder. Within that init file - you have your main method, and a second method thats called from the main method - you can use MagicMock.

import function_name

def test_main_function(self):
    """Testing main function"""
    function_name.second_method_being_called = MagicMock()

Thats it. Thats how you mock it! *facepalm

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Donfidididondada