Итерировать по возвращаемому значению - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь смоделировать метод, который возвращает список. После установки return_value он по-прежнему возвращает объект Mock вместо списка, поэтому я не могу перебрать этот объект.

Пример функции, которую я хочу протестировать:

def func(db_engine):
    query = f"SELECT * FROM table"
    query_result = db_engine.execute(query).fetchall()
    extracted_val = []
    for res in query_result:
        extracted_val.append(res[1])
    return extracted_val

Пример теста:

def test_fun():
    query = MagicMock()
    query_res = [("name_1", "value_1"), ("name_2", "value_2")]
    expected_vals = ["value_1", "value_2"]
    db_engine = MagicMock()
    db_engine.execute(query).fetchall().return_value = query_res
    vals = func(db_engine)
    assert expected_vals == vals

В итоге, db_engine.execute(query).fetchall() должен вернуть список, поэтому я могу перебрать query_result, но этого не происходит. Althou query_result имеет правильные значения в атрибуте return_value, я не могу перебрать его.

1 Ответ

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

Здесь вы можете найти способ смоделировать цепной вызов c . Вот решение для модульного теста:

func.py:

def func(db_engine):
    query = f"SELECT * FROM table"
    query_result = db_engine.execute(query).fetchall()
    extracted_val = []
    for res in query_result:
        extracted_val.append(res[1])
    return extracted_val

test_func.py:

import unittest
from func import func
from unittest.mock import MagicMock


class TestFunc(unittest.TestCase):
    def test_func(self):
        query_res = [("name_1", "value_1"), ("name_2", "value_2")]
        expected_vals = ["value_1", "value_2"]
        db_engine = MagicMock()
        execute = db_engine.execute.return_value
        execute.fetchall.return_value = query_res
        vals = func(db_engine)

        db_engine.execute.assert_called_with("SELECT * FROM table")
        execute.fetchall.assert_called_once()
        self.assertEqual(expected_vals, vals)


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

Результаты модульного теста со 100% покрытием:

.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
src/stackoverflow/61318070/func.py            7      0   100%
src/stackoverflow/61318070/test_func.py      16      0   100%
-----------------------------------------------------------------------
TOTAL                                        23      0   100%

Python версия: Python 3.7.5

...