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

2024-05-02 12:57:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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>>

我想用它来印一张魔法牌。 有人能帮我了解发生了什么事吗?他们为什么互相对立


Tags: testimportselfreturnobjectfoodefsys
1条回答
网友
1楼 · 发布于 2024-05-02 12:57:40

您不需要使用sys.modules['random'] = MagicMock()更新模块源代码,如果没有这一行,它可以正常工作<MagicMock name='choice' id='...'>patch已经完成了隔离临时更新方法的所有工作。请参阅文档-Where to patch中的更多说明

相关问题 更多 >