python - 如何从单元测试中模拟.patch 库函数
问题描述
我有一个名为的模块learning
,它使用random.uniform()
. 我有一个名为test_learning.py
包含单元测试的文件。当我运行单元测试时,我希望代码中learning
的random.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()
.
解决方案
单元测试解决方案:
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%
推荐阅读
- javascript - Mongoose/Express 中使用的日期字段未在 PUG 中显示
- java - 在源代码中使用 selenium 时如何从命令行编译 java 程序?
- oracle - 创建索引时出现异常“资源繁忙并获取指定的NOWAIT或超时过期”
- c++ - 可以找到Mingw
- php - php Redis::hscan 使用通配符名称和条件检索所有哈希
- amazon-web-services - 是否可以使用 AWS S3 托管 MVC 应用程序?
- javascript - 如何动态获取项目区域的uuid
- python-3.x - TypeError: 'str' 对象在 SQlite3 中存储数据时不可调用
- mysql - 仅使用邮递员 API 拒绝用户 'root'@'localhost' 的访问
- python - pytest - 将具有特定参数值的测试标记为 pytest.mark.skip