我正在为一个函数编写一个单元测试,在实际的函数中:
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尝试过多次不同的迭代,但仍然没有效果。
发布于 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
from numpy.random import default_rng
def get_random():
rng = default_rng()
idx = 0
while idx < 50:
idx = rng.integers(100)
return idxtest_sut.py
@mock.patch('sut.default_rng')
def test_get_random(mocked):
mocked.return_value.integers.side_effect = range(60)
assert do_something() == 50https://stackoverflow.com/questions/71226749
复制相似问题