Вы неправильно смоделировали менеджер контекста trans
. Вот решение для модульного теста:
a.py
:
class A():
def __init__(self, engine):
self.engine = engine
def fetch_data(self):
with self.engine.begin() as trans:
rval = trans.execute("SELECT * FROM XXX")
test_a.py
:
import unittest
from unittest.mock import MagicMock, mock_open
from a import A
class TestA(unittest.TestCase):
def test_fetch_data(self):
engine_mock = MagicMock()
trans = engine_mock.begin.return_value.__enter__.return_value
trans.execute.return_value = 'fake data'
a = A(engine_mock)
a.fetch_data()
engine_mock.begin.assert_called_once()
trans.execute.assert_called_with("SELECT * FROM XXX")
if __name__ == '__main__':
unittest.main()
Результаты модульного теста со 100% покрытием:
.
----------------------------------------------------------------------
Ran 1 test in 0.002s
OK
Name Stmts Miss Cover Missing
--------------------------------------------------------------------
src/stackoverflow/61224956/a.py 6 0 100%
src/stackoverflow/61224956/test_a.py 14 0 100%
--------------------------------------------------------------------
TOTAL 20 0 100%
python версия: Python 3.7.5