Я рассмотрел некоторые из предыдущих вопросов здесь о имитации sqlite3 в python при выполнении модульных тестов, и, к сожалению, ни один из них не помог мне успешно имитировать результат 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 ()?
Спасибо!






После дальнейших попыток я обнаружил, что работает следующее:
@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)
Весь остальной код остается таким же, как и в исходном посте. Надеюсь, это поможет другим, если они когда-нибудь столкнутся с этим!