如何在 python 中模拟包含对象引用的继承属性

问题描述 投票:0回答:1

我正在尝试弄清楚如何使用 Patch 装饰器(或一般的单元测试库)来执行以下 python 代码(我使用的是 3.5 版本):

class C:
    def __init__(self):
        self._session = {'model':'modelName'}

    @property
    def session(self):
        return self._session
from c import C

class A:
    def __init__(self):
        self.attr_a = C()
from a import A
class B(A):
    def foo(self):
        model = self.attr_a.session.get('model', '').lower()
        print(model)
        return model

if __name__ == '__main__':
    b = B()
    b.foo()

我的

foo
测试(不完整)代码是:

import unittest
from b import B
from c import C
from unittest.mock import patch

class TestB(unittest.TestCase):
    def setUp(self):
        self.b = B()

    def test_foo(self, boh):
        found = self.b.foo()
        expected = 'test'
        self.assertEqual(found, expected)

所以我不知道在这种情况下如何使用mock。事实上,我什至无法弄清楚到底在哪里创建模拟,无论是在变量

model
(模块 B)的级别还是在
attr_a
变量(模块 A)的级别。我尝试了几种想法,但我总是得到
model
变量的真实值。

谢谢你

python inheritance mocking python-unittest
1个回答
0
投票

解决方案1:

也许最简单的解决方案是在 self.b.attr_a.session 上使用 patch.dict?

def test_foo(self):
    with patch.dict(self.b.attr_a.session, {'model': 'mockedModel'}):
        result = self.b.foo()
        self.assertEqual(result, 'mockedmodel')  # Check if it returns the lowercased model name

在这种情况下,我修补了

session
字典

解决方案2:

@patch('a.C.session', new_callable=PropertyMock)
def test_foo(self, mock_session_prop):
    mock_session_prop.return_value = {'model': 'mockedModel'}
    result = self.b.foo()
    self.assertEqual(result, 'mockedmodel') 

在本例中,我将

C
session
修补为属性

© www.soinside.com 2019 - 2024. All rights reserved.