副作用有条件地返回值

问题描述 投票:0回答:1

我在嘲笑类似于以下功能之一。有没有一种方法可以将参数作为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:
python python-3.x unit-testing pytest python-unittest
1个回答
1
投票

执行时将不同的参数传递给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%
© www.soinside.com 2019 - 2024. All rights reserved.