所以我有两次模拟的代码,第一次是通过以下方式模拟导入:
sys.modules['random'] = MagicMock()
第二次发生在使用该导入的函数的unittest内部,例如使用random的函数
测试。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])
这两个模拟相互对立,随机模拟不会发生。 当它随机打印时,实际上会打印:
<<bound method Random.choice of <random.Random object at 0x7fe688028018>>
我想用它来印一张魔法牌。 有人能帮我了解发生了什么事吗?他们为什么互相对立
您不需要使用
sys.modules['random'] = MagicMock()
更新模块源代码,如果没有这一行,它可以正常工作<MagicMock name='choice' id='...'>
patch
已经完成了隔离临时更新方法的所有工作。请参阅文档-Where to patch中的更多说明相关问题 更多 >
编程相关推荐