让我们想象一下,我们有一个基类,它包含一些公共逻辑,然后是该基类的一些实例,用于解决一些特定的问题。
我们还有一些接口函数,它为当前问题返回适当的实例。
在测试中,我想访问Python单元测试补丁装饰器在通过测试本身接受的参数“mocked_do_stuff”运行测试时修补原始接口时使用的确切实例。
让我们吃这样的东西:
from unittest import TestCase
from unittest.mock import patch
class MockerObjectInstance:
def __init__(self):
self._counter = 0
def do_stuff(self):
self._counter += 1
def mock_function(*args, **kwargs):
return MockerObjectInstance()
class TestSomething(TestCase):
@patch('path.to.original.interface.function', side_effect=mock_function)
def test_do_stuff_call_times(self, mocked_do_stuff):
# Do some tests that access original < do_stuff >
# get exact < MockerObjectInstance > that < mock_function > returned
# via the parameter < mocked_do_stuff > and assert counter was
# specific number, for example
我能做到这一点的唯一方法是使用一个全局参数来保存最后一个实例,然后在测试中访问它。
这是修改后的
mock_function
奏效了。
GLOBAL_PARAMETER = None
def mock_function(*args, **kwargs):
instance = MockerObjectInstance()
global GLOBAL_PARAMETER
GLOBAL_PARAMETER = instance
return instance
但我并不热衷于使用全局变量的解决方案,这是一种糟糕的做法。
尽管如此,每次测试都会更新全局参数。