在Python中模拟sqlite3 fetchone()

时间:2018-08-10 09:20:00

标签: python unit-testing sqlite mocking

我在这里进行了一些先前的问题,有关在进行单元测试时在python中模拟sqlite3的问题,不幸的是,没有一个问题可以帮助我成功地模拟fetchone()的结果。

以下是我整理并尝试使其工作的快速测试示例:

TETS.PY

import unittest
import sqlite3
from unittest import TestCase, mock
from unittest.mock import patch, MagicMock

class Foo: 

    def checkActive(self):
        conn = sqlite3.connect('lll.db')
        cur = conn.execute("SELECT * FROM SQLITE_MASTER")
        value = cur.fetchone()
        return value


class test_Foo(TestCase):

    @patch('tets.sqlite3')
    def test_shortTest(self, mock_sql):
        mock_sql.connect().cursor().fetchall.return_value = ('Test',)

        test_class = Foo()
        return_mock = test_class.checkActive()
        print(return_mock)

if __name__ == '__main__':  # pragma: no cover -> local unittest main call
    unittest.main()

我已经尝试了上述方法的变种,还修补了tets.sqlite3.connect并从那里开始,但我总是以下结果之一:

[Running] python -u "c:\Users\z003uwfm\Desktop\tets.py"
<MagicMock name='connect().execute().fetchone()' id='45622576'>
.
----------------------------------------------------------------------
Ran 1 test in 0.016s

OK

[Running] python -u "c:\Users\z003uwfm\Desktop\tets.py"
None
.
----------------------------------------------------------------------
Ran 1 test in 0.021s

OK

有人有一个真实的工作示例,他们能够模拟fetchone()或fetchall()的收益吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

进一步修补后,我发现以下方法可行:

@patch('sqlite3.connect')
def test_shortTest(self, mock_sql):
    mock_sql.return_value.execute.return_value.fetchone.return_value = ('Test',)
    test_class = Foo()
    return_mock = test_class.checkActive()
    print(return_mock)

所有其他代码均与原始帖子相同。希望这对其他人有帮助,可以帮助他们!