代码之家  ›  专栏  ›  技术社区  ›  Iced Tea

使用带有side_effect的Python单元测试补丁,如何获得mock返回的确切内容?

  •  0
  • Iced Tea  · 技术社区  · 2 年前

    让我们想象一下,我们有一个基类,它包含一些公共逻辑,然后是该基类的一些实例,用于解决一些特定的问题。

    我们还有一些接口函数,它为当前问题返回适当的实例。

    在测试中,我想访问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
    

    但我并不热衷于使用全局变量的解决方案,这是一种糟糕的做法。 尽管如此,每次测试都会更新全局参数。

    0 回复  |  直到 2 年前