Mocking cursor.fetchone() returns None istead of returning a value in python

I wrote a function for my project which fetches data from MSSQL server using Pyodbc. The function works fine. When I write unittest cases using unittest and mock library and mocked the cursor.fetchone and returned a predefined value but while running the test case it returns None instead of returning the value. Here are my code.

Store.py

import os
from datetime import date
from datetime import timedelta
import logging
logging.basicConfig(filename="source_monitor.log", format='%(name)s - %(levelname)s - %(asctime)s %(message)s', filemode='a') 
logger=logging.getLogger() 


class KMExtracter:
    def __init__(self,metric_collected_date):
        self.metric_collected_date = metric_collected_date
    # argument conn is a db connection which will passed in seperate program
    def get_metrics_by_technology(self, conn, technology):
        try:
        
            cursor = conn.cursor()
            cursor.execute(
                "SELECT COUNT(*) FROM URL_STORE WHERE Technology='{0}' firstExtractionDate  BETWEEN '{1} 00:00:00' AND '{1} 23:59:59'".format(self.technology[technology],
                        self.metric_collected_date
                ))
                
            
            count = cursor.fetchone()
            return count[0]
        except Exception as e:
            logging.error("{0} at get_metrics_by_technology()".format(e))

test_store.py

class TestKM(unittest.TestCase):
    def test_get_metrics_by_technology(self):
        mock_data_interface = Mock()
        mock_data_interface.cursor.return_value.execute.return_value.fetchone.return_value(23987,)
        
        km = KMExtracter('2021-04-03')
        print(km.get_metrics_by_technology(mock_data_interface, 'SOME'))
        self.assertEqual(23987,km.get_metrics_by_technology(mock_data_interface, 'SOME'))

Error I got: AssertionError: 23987 != None

Upvotes: 0

Views: 1050

Answers (1)

class TestKM(unittest.TestCase):
    def test_get_metrics_by_technology(self):
        mock_data_interface = Mock()
       
        # execute.return_value was removed from the below line.
        mock_data_interface.cursor.return_value.fetchone.return_value(23987,)
        
        km = KMExtracter('2021-04-03')
        print(km.get_metrics_by_technology(mock_data_interface, 'SOME'))
        self.assertEqual(23987,km.get_metrics_by_technology(mock_data_interface, 'SOME'))

Upvotes: 0

Related Questions