首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sys.modules和mock.patch模拟(静态函数上的Python冲突)

问如何使用sys.modules和mock.patch模拟(静态函数上的Python冲突)
EN

Stack Overflow用户
提问于 2020-08-15 08:23:46
回答 1查看 759关注 0票数 4

所以我有这段代码模拟了两次,第一次是通过模拟导入:

代码语言:javascript
复制
sys.modules['random'] = MagicMock()

第二次发生在使用该导入的函数的单元测试中,例如使用random的函数

测试。py是:

代码语言:javascript
复制
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为:

代码语言:javascript
复制
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不会发生。当它随机打印时,它实际上打印:

代码语言:javascript
复制
<<bound method Random.choice of <random.Random object at 0x7fe688028018>>

我想让它打印一个MagicMock。有人能帮我弄明白发生了什么事吗?为什么他们要互相反捕?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-18 01:46:32

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63421480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档