首页 > 解决方案 > 模拟 cursor.fetchone() 返回 None 而不是在 python 中返回一个值

问题描述

我为我的项目编写了一个函数,它使用 Pyodbc 从 MSSQL 服务器获取数据。该功能工作正常。当我使用 unittest 和 mock 库编写 unittest 用例并模拟 cursor.fetchone 并返回一个预定义的值时,但在运行测试用例时它返回 None 而不是返回值。这是我的代码。

存储.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'))

我得到的错误: AssertionError: 23987 != None

标签: pythonmockingpyodbcpython-unittestmagicmock

解决方案


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'))

推荐阅读