Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sys.modules和mock.patch进行模拟(Python对静态函数的干扰)_Python_Unit Testing_Mocking_Magicmock - Fatal编程技术网

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

如何使用sys.modules和mock.patch进行模拟(Python对静态函数的干扰),python,unit-testing,mocking,magicmock,Python,Unit Testing,Mocking,Magicmock,所以我有两次模拟的代码,第一次是通过以下方式模拟导入: 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()

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

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()
更新模块源代码,如果没有这一行,它工作正常
<代码>补丁
已经完成了隔离临时更新方法的所有工作。查看文档中的更多解释-

您能解释一下为什么需要双重模拟,以及测试中会发生什么吗?另外,您的静态函数中有
self
——可能只是一个输入错误。我正在尝试创建自动单元测试,我这样做了两次,一次是在Begging尝试模拟导入的库,另一次是在适当的单元测试中使用with mock patch进行模拟。我知道这可能会有问题,但是它适用于除静态函数之外的所有函数。当我在测试中打印模拟对象时,它会随机打印模块,而不是模拟的,我不知道为什么它只发生在staticmethods中。嗯,如果您能显示更多的代码,可能会有所帮助。你是说,如果你测试静态函数,那么使用
mock.patch
随机模拟可以工作,但是如果你另外模拟
sys.modules
它就会停止工作?是的,比恩先生,确实是这样,我编辑了这个问题,为你提供了更多的代码信息。好吧,首先我想说,第一次测试中的补丁(更准确地说,结束修补)正在恢复
sys.modules
中的原始值,因为这就是它的工作方式。您可以通过注释第一个测试来验证这一点。仍然不清楚您为什么首先需要更改
sys.modules