gpt4 book ai didi

python - 如何使用 sys.modules 和 mock.patch 进行模拟(Python 对静态函数的干扰)

转载 作者:行者123 更新时间:2023-12-03 20:49:53 24 4
gpt4 key购买 nike

所以我有这个模拟两次的代码,第一次是通过模拟导入:

sys.modules['random'] = MagicMock()
第二次发生在使用该导入的函数的单元测试内,例如使用随机的函数
测试。 py 是:
import sys
import unittest
from unittest import mock
from unittest.mock import MagicMock
import foo

sys.modules['random'] = MagicMock()

class test_foo(unittest.TestCase):

def test_method(self):
with mock.patch('random.choice', return_value = 2):
object = foo.FooClass(3)
self.assertEqual(2, object.method(), 'Should be 2')

def test_staticmethod(self):
with mock.patch('random.choice', return_value = 2):
object = foo.FooClass(3)
self.assertEqual(2, object.method(), 'should be 2')
原始文件 Foo.py 是:
import random

class FooClass:

def __init__(self,arg):
self.arg = arg

def method(self):
print(random.choice)
return random.choice([1,2,3])

@staticmethod
def staticmethod():
print(random.choice)
random.choice([1,2,3])
两个 mock 相互对立,随机的 mock 不会发生。
当它随机打印时,它实际上打印:
<<bound method Random.choice of <random.Random object at 0x7fe688028018>>
我希望它打印一个 MagicMock。
有人可以帮助我了解发生了什么吗?为什么他们互相反对?

最佳答案

您无需使用 sys.modules['random'] = MagicMock() 更新模块源没有这条线它工作正常<MagicMock name='choice' id='...'> . patch已经完成了隔离临时更新方法的所有工作。在文档中查看更多解释 - Where to patch

关于python - 如何使用 sys.modules 和 mock.patch 进行模拟(Python 对静态函数的干扰),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63421480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com