gpt4 book ai didi

python - 使用相同的模拟在两个不同的文件中修补相同的模块

转载 作者:行者123 更新时间:2023-12-05 06:46:07 25 4
gpt4 key购买 nike

我正在使用 mock库来修补由两个文件导入的模块,这两个文件定义了一个类及其子类。像这样的东西:

# ---- file module_to_patch.py -----
def foo():
return 1

def faa():
return 2

# ---- file base_class.py -----
import module_to_patch

class base_class(object):
def __init__(self):
self.x = module_to_patch.foo()

# ---- file sub_class.py -----
import module_to_patch

class sub_class(object):
def __init__(self):
super(sub_class, self).__init__()
self.y = module_to_patch.faa()

据我所知(参见 here),在我的测试中我应该同时修补 base_class.module_to_patchsub_class.module_to_patch,例如:

# file test_sub_class.py:
from unittest import TestCase
from mock import patch

class TestSubClass(TestCase):

def setUp(self):
self.patcher_1 = patch('base_class.module_to_patch', autospec=True)
self.mock_1 = self.patcher_1.start()
self.patcher_2 = patch('sub_class.module_to_patch', autospec=True)
self.mock_2 = self.patcher_2.start()

def tearDown(self):
patch.stopall()

问题:

  • 是否有更简单的方法来实现此功能?
  • 如果不是——两个补丁修补同一个实体,我怎样才能让两个补丁程序返回相同的 Mock() 对象?我是否只是将 mock_1 作为 new 对象传递给 patcher_2
  • 以上是处理这种情况的正确方法吗?

最佳答案

实现我认为您正在尝试做的事情的最简单方法是简单地模拟导入对象中的模块。如果您只想为整个测试套件模拟模块:

# file test_sub_class.py:
from unittest import TestCase
from mock import Mock

import sub_class
import base_class
MODULE_MOCK = Mock()
sub_class.module_to_patch = MODULE_MOCK
base_class.module_to_patch = MODULE_MOCK

class TestSubClass(TestCase):

def test_sub_class_init(self):
self.base_class = base_class.base_class()
self.assertTrue(MODULE_MOCK.foo.called)

self.sub_class = sub_class.sub_class()
self.assertTrue(MODULE_MOCK.faa.called)

如果你只想模拟一个测试,你可以使用 patch.object作为装饰器并给它你想要 patch.object 使用的 Mock 对象 (MOCK_OBJECT):

# file test_sub_class.py:
from unittest import TestCase
from mock import Mock, patch

import sub_class
import base_class

MOCK_OBJECT = Mock()

class TestSubClass(TestCase):

@patch.object(sub_class, 'module_to_patch', MOCK_OBJECT)
@patch.object(base_class, 'module_to_patch', MOCK_OBJECT)
def test_sub_class_init(self):
self.base_class = base_class.base_class()
self.assertTrue(MOCK_OBJECT.foo.called)
self.sub_class = sub_class.sub_class()
self.assertTrue(MOCK_OBJECT.faa.called)

关于python - 使用相同的模拟在两个不同的文件中修补相同的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18351286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com