Как проверить, была ли вызвана транзакция SQL Alchemy? - PullRequest
0 голосов
/ 15 апреля 2020

Как мне протестировать следующий код, где механизм изначально должен был быть объектом механизма SQLAlchemy? Тестовый пример, который я предоставил, к сожалению, не работает. Мне удалось проверить, был ли вызван метод begin движка, но не оператор execute. Второй execute_mock никогда не вызывается после выполнения метода fetch_data.

class A():
    def __init__(self, engine):
        self.engine = engine

    def fetch_data(self):
        with self.engine.begin() as trans:
            trans.execute("SELECT * FROM XXX")

from unittest.mock import MagicMock
def test_A():
    execute_mock = MagicMock()
    engine_mock = MagicMock()
    engine_mock.begin.return_value.execute = execute_mock

    A(engine_mock)
    execute_mock.assert_not_called()
    A.fetch_data()
    execute_mock.assert_called_with("SELECT * FROM XXX")

1 Ответ

1 голос
/ 29 апреля 2020

Вы неправильно смоделировали менеджер контекста 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

...