首页 > 解决方案 > 如何从单元测试中模拟.patch 库函数

问题描述

我有一个名为的模块learning,它使用random.uniform(). 我有一个名为test_learning.py包含单元测试的文件。当我运行单元测试时,我希望代码中learningrandom.uniform(). 我怎样才能做到这一点?这是我目前所拥有的。

import random
import unittest
import unittest.mock as mock

class TestLearning(unittest.TestCase):

    def test_get_random_belief_bit(self):
        with mock.patch('learning.random.uniform', mock_uniform):
            bit = learning.get_random_belief_bit(0.4)
            self.assertEqual(bit, 0)

但是测试(有时)失败,因为learning.get_random_belief_bit()似乎使用的是真实的random.uniform().

标签: pythonunit-testingmockingpython-unittest

解决方案


单元测试解决方案:

learning.py

import random


def get_random_belief_bit(f):
    return random.uniform()

test_learning.py

import random
import unittest
import unittest.mock as mock
import learning


class TestLearning(unittest.TestCase):

    def test_get_random_belief_bit(self):
        with mock.patch('random.uniform', mock.Mock()) as mock_uniform:
            mock_uniform.return_value = 0
            bit = learning.get_random_belief_bit(0.4)
            self.assertEqual(bit, 0)
            mock_uniform.assert_called_once()


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

带有覆盖率报告的单元测试结果:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Name                                          Stmts   Miss  Cover   Missing
---------------------------------------------------------------------------
src/stackoverflow/57874971/learning.py            3      0   100%
src/stackoverflow/57874971/test_learning.py      13      0   100%
---------------------------------------------------------------------------
TOTAL                                            16      0   100%

推荐阅读