如何使用 sys.modules 和 mock.patch 进行模拟(Python 对静态函数的干扰)
How to mock using sys.modules and with mock.patch (Python interference on static functions)
所以我有这段代码模拟了两次,第一次是通过模拟导入:
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相互对立,random的mock并没有发生。
当它随机打印时,它实际上打印:
<<bound method Random.choice of <random.Random object at 0x7fe688028018>>
我想要打印一个 MagicMock。
有人可以帮助我了解发生了什么吗?他们为什么要互相反对?
你不需要用 sys.modules['random'] = MagicMock()
更新模块源,没有这行它工作正常 <MagicMock name='choice' id='...'>
。 patch
已经完成了隔离临时更新方法的所有工作。在文档中查看更多解释 - Where to patch
所以我有这段代码模拟了两次,第一次是通过模拟导入:
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相互对立,random的mock并没有发生。 当它随机打印时,它实际上打印:
<<bound method Random.choice of <random.Random object at 0x7fe688028018>>
我想要打印一个 MagicMock。 有人可以帮助我了解发生了什么吗?他们为什么要互相反对?
你不需要用 sys.modules['random'] = MagicMock()
更新模块源,没有这行它工作正常 <MagicMock name='choice' id='...'>
。 patch
已经完成了隔离临时更新方法的所有工作。在文档中查看更多解释 - Where to patch