side_effect для условного возврата значений - PullRequest
0 голосов
/ 07 марта 2020

Я издеваюсь над одной из функций, аналогичных приведенным ниже. Есть ли способ передать аргументы как часть side_effect, чтобы я мог использовать одну и ту же функцию для (имитации) загрузки как заказа, так и данных о продукте?

def mock_load_data(self, name="order"):
    if name == "order":
       return 1
    elif name == "product":
       return 2

@patch('src.shop.order.load_data', side_effect=mock_load_data)
def test_order:

1 Ответ

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

Передача различных параметров в mock_load_data, когда он выполнится, он сделает это.

Например,

main.py:

from order import load_data


def main(name):
    return load_data(name)

order.py:

def load_data():
    return 'real data'

test_main.py:

import unittest
from unittest.mock import patch
from main import main


def mock_load_data(name="order"):
    if name == "order":
        return 1
    elif name == "product":
        return 2


class TestMain(unittest.TestCase):
    @patch('main.load_data', side_effect=mock_load_data)
    def test_main(self, mock_load_data):
        rval1 = main('order')
        self.assertEqual(rval1, 1)
        rval2 = main('product')
        self.assertEqual(rval2, 2)


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

Результаты модульных испытаний с отчетом о покрытии:

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

OK
Name                                      Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------
src/stackoverflow/60572053/main.py            3      0   100%
src/stackoverflow/60572053/order.py           2      1    50%   2
src/stackoverflow/60572053/test_main.py      16      0   100%
-----------------------------------------------------------------------
TOTAL                                        21      1    95%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...