-1

This is my first time writing unit tests, apologies for the annoyances inevitably present, despite my best efforts. I am trying to mock requests.post but my test function is not having the desired effect, to induce a 404 status code so that I can test error handling.

mymodule.py

def scrape(data):
    logger.debug(f'\nBeginning scrape function')
    result = {}
    exceptions = {}
    for id, receipts in data.items():
        logger.debug(f'Looking up Id # {id} and receipts: \n{receipts}')
        dispositions = []
        for receipt in receipts:
            logger.debug(f'The length of receipts is:' + str(len(receipts)))
            attempts = 1
            while attempts < 6:
                logger.debug(
                    f'This is attempt number {attempts} to search for {receipt}')
                payload = {'receipt': 'receipt',
                           'button': 'CHECK+STATUS', }
                try:
                    NOW = datetime.today().strftime('%c')
                    logger.debug(NOW)
                    logger.debug(f'Making post request for: {receipt}')
                    response = requests.post(URL, data=payload, headers=HEADERS, timeout=10)
                except Exception as e:
                    logger.debug(f'There was an exception: {e}')
                    exceptions[id] = receipt + f': {e}'
                    time.sleep(3)
                    attempts += 1
                else:
                    logger.debug(f'It worked {response.status_code}')
                    attempts = 6
                    disp = parse(response)
                    dispositions.append(f'{receipt}: {disp}')
        result[id] = dispositions
        logger.debug(f'Here is the result: {result}')
        return result

test_mymodule.py

def test_scrape(self):
    print(f'\ntest_scrape running')

    # mock a 404 in scrape() here
    with patch("mymodule.requests") as patched_post:

        # mock a request response
        patched_post.return_value.status_code = 404
        print('404 mocked')

        # verify the function returns nothing due to 404
        result = scrape(test_data)
        print(f'\n{result}')
        mock_requests.post.assert_called_once()
        self.assertEqual(result, {})
samsmug
  • 35
  • 10

1 Answers1

0

def test_scrape(self): print(f'\ntest_scrape running')

# mock a 404 in scrape() here
with patch("mymodule.requests") as patched_post:

    # mock a request response
    patched_post.return_value.status_code = 404
    print('404 mocked')

    # verify the function returns nothing due to 404
    result = scrape(test_data)
    print(f'\n{result}')
    mock_requests.post.assert_called_once()
    self.assertEqual(result, {})