【发布时间】:2019-09-23 23:26:27
【问题描述】:
我有一个父对象,它接收一个连接对象。
我在这个连接对象上运行一个方法来生成一个配置对象。当我嘲笑这个时,我得到的不是Foo:
<Mock name='mock().get_properties().property_c' id='1910891784064'>
代码:
# Real
class ClassC:
property_c = "Foo"
class ClassB:
def __init__(self):
pass
def login(self):
print("Logged in...")
def get_properties(self):
return ClassC()
class ClassA:
def __init__(self, conn):
self.conn = conn
self.conn.login()
a = ClassA(conn=ClassB()) >>> Logged in...
result = a.conn.get_properties()
print(result.property_c) >>> Foo
# Mocked
from unittest.mock import Mock
mock_b = Mock()
mock_c = Mock()
mock_c.property_c.return_value = "Foo_Mock"
mock_b.get_properties.return_value = mock_c
a = ClassA(conn=mock_b())
result = a.conn.get_properties()
print(result.property_c) >>> Output shown above
如何正确地模拟这个?
Edit1 - 建议的重复 S.O 答案仅部分回答了问题。
Edit2 - 我忘了包含模拟登录行为
mock_b.login.return_value = print("Logged in...") awesoon 的回答仍然适用于这个修改:
mock_b = Mock()
mock_c = Mock()
type(mock_c).property_c = PropertyMock(return_value="Foo_Mock")
mock_b.get_properties.return_value = mock_c
mock_b.login.return_value = print("Logged in...")
【问题讨论】:
-
我看到了如何将 PropertyMock 用于 ClassC,但是如何将它注入 ClassB?
-
type(mock_c).property_c = PropertyMock(return_value="Foo_Mock")和mock_b.get_properties().property_c应该可以解决问题。注意我没有打电话给mock_b() -
我仍然收到
<Mock name='mock().get_properties().property_c' id='1910891784064'> -
查看这个:ideone.com/aCy9Ye