所以我有这段代码模拟了两次,第一次是通过模拟导入:
sys.modules['random'] = MagicMock()第二次发生在使用该导入的函数的单元测试中,例如使用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])这两个mock相互对比,随机的mock不会发生。当它随机打印时,它实际上打印:
<<bound method Random.choice of <random.Random object at 0x7fe688028018>>我想让它打印一个MagicMock。有人能帮我弄明白发生了什么事吗?为什么他们要互相反捕?
发布于 2020-08-18 01:46:32
你不需要在没有这行代码的情况下使用sys.modules['random'] = MagicMock()来更新模块源代码,它可以很好地工作在<MagicMock name='choice' id='...'>中。patch已经完成了隔离的临时更新方法的所有工作。请参阅文档中的更多说明- Where to patch
https://stackoverflow.com/questions/63421480
复制相似问题