我正在尝试弄清楚如何使用 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
变量的真实值。
谢谢你
解决方案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
字典@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
修补为属性