【问题标题】:How do I patch the values of a dictionary that belongs to a class with the Python unittest module?如何使用 Python unittest 模块修补属于某个类的字典的值?
【发布时间】:2020-06-24 14:13:32
【问题描述】:

让我举个例子:

class Devices:
    the_dict = {'apple': some_class(), 'android': some_class()}

在这个例子中,我想修补 some_class()

我无法模拟类本身(在本例中为 Devices),因为那将是我首先要测试的类。

我已尝试通过修补字典本身来解决此问题,但模拟无法识别不同键和值之间的差异。例如,假设我创建了一个名为 mocked_dict 的模拟,测试看不出 mocked_dict['alpha']mocked_dict[' 之间的区别测试版']。我也尝试过 patch.dict,但无济于事。我只在使用 return_value 时收到属性错误。

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: python unit-testing dictionary mocking patch


    【解决方案1】:

    不确定这是否是您要查找的内容,但请考虑添加一个辅助方法 mock_device_dict 来猴子修补给定 Devices 实例的字典:

    import unittest
    from unittest.mock import Mock
    
    
    class some_class:
        pass
    
    
    class Devices:
        the_dict = {'apple': some_class(), 'android': some_class()}
    
    
    class MyTest(unittest.TestCase):
        def mock_device_dict(self, devices_instance):
            devices_instance.the_dict = {k: Mock() for k in devices_instance.the_dict}
            return devices_instance
        
        def test_device(self):
            devices = Devices()
            self.mock_device_dict(devices)
            # continue with your test here ...
    
    
    if __name__ == '__main__':
        unittest.main()
    

    【讨论】:

    • 解决方案有效。我对其进行了更改,使辅助方法返回字典而不是整个类实例,但我不明白为什么它不能正常工作。我想这是一个偏好问题?无论如何,只是为了澄清一下,我是将辅助方法作为测试类(在本例中为 MyTest)的一部分,还是创建一个单独的类来存储测试辅助方法?
    • 返回修改后的实例与模拟字典主要是一个偏好问题。是否将方法保留为测试的一部分也取决于您以及您如何运行测试 - 我个人更喜欢这样做。例如,使用unittest 运行测试时,仅测试以test_ 开头的方法,因此实际上并未测试mock_device_dict
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多