You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mock.patch为不同模块的random.random设置不同返回值失败排查

问题:按模块Mock random.random()时返回值不符合预期

场景与代码

我在给依赖random.random()的类写单元测试,想给不同模块的random.random()设置不同固定返回值,保证测试结果稳定,但实际测试中两个模块的返回值完全一致,触发了断言错误。

模块代码

modul1.py:

import random

def function():
    return random.random()

modul2.py:

import random

def function():
    return random.random()

测试代码

def test_function():
    with mock.patch('modul1.random.random', return_value=1), \
         mock.patch('modul2.random.random', return_value=0):
        val1 = modul1.function()
        val2 = modul2.function()
        assert not val1 == val2

预期与实际结果

  • 预期:val1=1、val2=0,测试通过
  • 实际:触发断言错误 assert not 0 == 0

原因与解决方法

问题根源

Python里模块是单实例的,modul1.random和modul2.random指向的是同一个全局random模块对象。你patch的modul1.random.random和modul2.random.random其实是同一个函数,最后一次patch的返回值(0)会覆盖之前的设置,所以两个模块调用的都是被最后修改后的函数。

解决步骤

  1. 修改模块的导入方式:把random.random直接导入到模块的命名空间,而不是导入整个random模块
    修改modul1.py:

    from random import random
    
    def function():
        return random()
    

    修改modul2.py:

    from random import random
    
    def function():
        return random()
    
  2. 修改测试代码的patch目标:现在直接patch模块内导入的random对象即可

    def test_function():
        with mock.patch('modul1.random', return_value=1), \
             mock.patch('modul2.random', return_value=0):
            val1 = modul1.function()
            val2 = modul2.function()
            assert not val1 == val2
    

这样每个模块的random是各自命名空间里的独立引用,patch时不会互相覆盖,就能得到预期的不同返回值。

内容的提问来源于stack exchange,提问作者chochf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:35:03