【问题标题】:Python mock a base class's attributePython 模拟基类的属性
【发布时间】:2018-09-21 22:22:00
【问题描述】:

为了测试,我想在基类中更改单个 Class 实例的属性 (self.attr)。

# app.py
class Base():
    def __init__(self):
        self.attr = 'original_value'

    def show(self):
        print(self.attr) 

class App():
    def __init__(self):  
        self.base = Base()

这是我尝试模拟 Base 类实例的属性 attr

# test_app.py
from mock import Mock
from app import App

def test_mock_inherited_class_instance():
    """ With mocking. Change app.base.attr from 'original_value' to 'new_value'.
    """
    app = App()
    app.base = Mock()
    app.base.attr = 'new_value'
    app.base.show() # I'd like this to show 'new_value', NOT 'original_value'

【问题讨论】:

    标签: python unit-testing mocking patch


    【解决方案1】:

    类的实例成员或实例变量与类属性或类属性不同。这仅通过保留所有类属性来模拟attr

    import mock
    from app import App
    from app import Base
    import unittest
    from StringIO import StringIO
    class TestApp(unittest.TestCase):
    
        @mock.patch('sys.stdout', new_callable=StringIO)
        def test_mock_instance_var(self, mocked_stdout):
    
            base = Base()
            app = App()
    
            mock_base = mock.MagicMock(name='Base', spec=Base)
            instance = mock_base.return_value
            instance.attr.return_value = 'mmm'
            base.attr = instance.attr.return_value
            self.assertEqual(base.attr, 'mmm')
    
            app.base = base
    
            self.assertEqual(app.base.attr, 'mmm')
            # the print stdout of show()
            app.base.show()
            self.assertEqual(mocked_stdout.getvalue(), 'mmm\n')
    

    【讨论】:

    • 我对此进行了测试,效果很好。非常感谢!
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多