python - 模拟 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
解决方案
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'))
推荐阅读
- database - $or 和 $text 的 MongoDB 聚合奇怪行为
- android - 在条形码上添加文本
- java - CompletableFuture 超时
- jira - 如何将 Jira Webhook 连接到 Azure 服务总线
- stellar.js - 不支持恒星核心交易
- ssl - 解析切换规则时检测到 HAProxy 错误:没有这样的 ACL:'{hdr(host)'
- types - 在 matillion ETL 工具中将文本转换为日期时间
- sparql - 如何从 sparql 中的对象 URI 查询数据
- laravel - 为什么 Laravel Voyager BREAD Accessor 不返回格式化日期?
- git - 通过 Git 远程跟踪分支的给定名称如何找到哪个本地分支跟踪它?