首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中模拟随机数生成器对象

如何在python中模拟随机数生成器对象
EN

Stack Overflow用户
提问于 2022-02-22 18:44:40
回答 1查看 618关注 0票数 0

我正在为一个函数编写一个单元测试,在实际的函数中:

代码语言:javascript
运行
复制
rng = default_rng()
...
... # a little while later
while N<50:
    ...
    idx = rng.integers(100)

如何模拟变量idx或对rng.integers的调用?换句话说,我想让idx从一个简单的有序列表0,1,2,…

每次我尝试@mock.patch('numpy.random.default_rng', side_effects=[0, 1, 2, ...])修饰测试函数时,代码都会‘运行’,但不会做我希望的事情。如果我将上面的内容替换为'numpy.random.default_rng.integers‘,我会得到一个错误,即default_rng没有属性整数(我相信bc是一个生成器对象),我使用@mock.patch.object尝试过多次不同的迭代,但仍然没有效果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-23 19:22:56

你的修补有一些问题。首先,您显然在使用from numpy.random import default_rng,因此您必须修补模块中的default_rng实例--参见打补丁的地方

其次,integers是在default_rng实例上调用的,而不是在类上调用的,因此您首先必须通过return_value获得模拟实例。

第三,它被称为side_effect,而不是side_effects (尽管这可能只是您的问题中的一个错误)。

因此,一个工作的版本可能看起来像这样(稍微修改一下,实际上能够测试一些东西):

sut.py

代码语言:javascript
运行
复制
from numpy.random import default_rng

def get_random():
    rng = default_rng()
    idx = 0
    while idx < 50:
        idx = rng.integers(100)
    return idx

test_sut.py

代码语言:javascript
运行
复制
@mock.patch('sut.default_rng')
def test_get_random(mocked):
    mocked.return_value.integers.side_effect = range(60)
    assert do_something() == 50
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71226749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档