首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python模拟dbconnection

使用python模拟dbconnection
EN

Stack Overflow用户
提问于 2019-12-07 14:02:55
回答 2查看 2K关注 0票数 1

我试图从fetchall()游标对象中模拟dbconnection。我正在尝试以下具有预期返回值的代码。但是,它没有返回值。我现在有了答案,并编辑了单元测试,以包括答案也包括db.py

代码语言:javascript
复制
def query_db(db_connection, query):
    """

    :param db_connection: dbconnection object
    :param query: query to be executed
    :return:
    """
    cur = db_connection.cursor()
    try:
        logging.info(f"Query to be executed : {query}")
        cur.execute(query)
        results = cur.fetchall()
        logging.info(f"Query Results : {results}")
    except Exception:
        logging.exception("Exception while executing \'query_db\' function")
        raise Exception(f"Error while executing query : {query}. Please check the logs for details")
    return results

测试用例:

代码语言:javascript
复制
    def test_get_client_object(self):
        dbconnection = Mock(name="dbconnection")
        mycursor = Mock(name="mycursor")
        mycursor.fetchall.return_value = "testing_return_value"
        dbconnection.cursor.return_value = mycursor  # I was doing dbconnection.cursor = mycursor .  ... which caused the error

        self.assertEqual("testing_return_value", utils.query_db(dbconnection, 12345))

我得到了后续断言错误。它返回一个模拟对象,而不是预期的返回值。

代码语言:javascript
复制
<Mock name='mycursor().fetchall()' id='4443879760'> != testing_return_value

Expected :testing_return_value
Actual   :<Mock name='mycursor().fetchall()' id='4443879760'>
<Click to see difference>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-10 08:53:50

以下是单元测试解决方案:

utils.py

代码语言:javascript
复制
def query_db(db_connection, query):
    cur = db_connection.cursor()
    try:
        print(f"Query to be executed : {query}")
        cur.execute(query)
        results = cur.fetchall()
        print(f"Query Results : {results}")
    except Exception:
        print("Exception while executing \'query_db\' function")
        raise Exception(
            f"Error while executing query : {query}. Please check the logs for details")
    return results

test_utils.py

代码语言:javascript
复制
import unittest
from unittest.mock import Mock
import utils


class TestUtils(unittest.TestCase):
    def test_get_client_object(self):
        dbconnection = Mock(name="dbconnection")
        mycursor = Mock(name="mycursor")
        mycursor.fetchall.return_value = "testing_return_value"
        dbconnection.cursor.return_value = mycursor

        self.assertEqual("testing_return_value",
                         utils.query_db(dbconnection, 12345))
        dbconnection.cursor.assert_called_once()
        mycursor.execute.assert_called_once_with(12345)
        mycursor.fetchall.assert_called_once()

    def test_query_db_exception(self):
        dbconnection = Mock(name="dbconnection")
        mycursor = Mock(name="mycursor")
        mycursor.fetchall.side_effect = Exception
        dbconnection.cursor.return_value = mycursor

        with self.assertRaises(Exception) as cm:
            utils.query_db(dbconnection, 12345)
        self.assertEqual(str(
            cm.exception), 'Error while executing query : 12345. Please check the logs for details')


if __name__ == '__main__':
    unittest.main(verbosity=2)

包含100份覆盖报告的单元测试结果:

代码语言:javascript
复制
test_get_client_object (__main__.TestUtils) ... Query to be executed : 12345
Query Results : testing_return_value
ok
test_query_db_exception (__main__.TestUtils) ... Query to be executed : 12345
Exception while executing 'query_db' function
ok

----------------------------------------------------------------------
Ran 2 tests in 0.002s

OK
代码语言:javascript
复制
Name                                       Stmts   Miss  Cover   Missing
------------------------------------------------------------------------
src/stackoverflow/59226762/test_utils.py      22      0   100%
src/stackoverflow/59226762/utils.py           11      0   100%
------------------------------------------------------------------------
TOTAL                                         33      0   100%

源代码:https://github.com/mrdulin/python-codelab/tree/master/src/stackoverflow/59226762

票数 1
EN

Stack Overflow用户

发布于 2020-11-03 16:16:54

接受的答案对我不起作用,而且我仍然在被链式的调用-- fetchall()。我嘲笑了这三个层次,包括提取,然后它起作用了,也许它对某人有帮助:

测试:

代码语言:javascript
复制
expected = ["{\"parameter\":\"1337\"}"]
myconnection = mocker.Mock(name="dbconnection")
mycursor = mocker.Mock(name="mycursor")
myfetchall = mocker.Mock(name="myfetchall")  # I needed to mock this as well
myfetchall.fetchall.return_value = expected
mycursor.execute.return_value = myfetchall
myconnection.cursor.return_value = mycursor

职能:

代码语言:javascript
复制
cursor = connection.cursor()
return cursor.execute(sqlstatement).fetchall()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59226762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档