side_effect 到 return 值有条件

side_effect to return values conditionally

我正在模拟类似于下面的功能之一。有没有办法将参数作为 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:

执行时将不同的参数传递给 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/Whosebug/60572053/main.py            3      0   100%
src/Whosebug/60572053/order.py           2      1    50%   2
src/Whosebug/60572053/test_main.py      16      0   100%
-----------------------------------------------------------------------
TOTAL                                        21      1    95%