我觉得这可能相对简单,但是我正在尝试让它正常工作。我想模拟整个类,并指定该类中一个方法的返回值。
我已经查看了这里、几个其他问题以及当然是文档。但仍无法使其工作。请看下面的简单示例。
目录
我已经查看了这里、几个其他问题以及当然是文档。但仍无法使其工作。请看下面的简单示例。
目录
tmp
的内容:tmp
├── __init__.py
├── my_module.py
└── test_my_module.py
my_module.py
的内容:
class MyClass:
def __init__(self):
# Do expensive operations that will be mocked in testing.
self.a = 7
def my_method(self):
# For sake of simple example, always return 1.
return 1
def create_class_call_method():
"""Create MyClass instance and call its my_method method, returning
the result."""
instance = MyClass()
value = instance.my_method()
return value
test_my_module.py
的内容:
import unittest
from unittest.mock import patch, Mock
from tmp import my_module
class MyClassTestCase(unittest.TestCase):
def test_create_class_call_method(self):
# Attempt to patch MyClass as well as specify a return_value for
# the my_method method (spoiler: this doesn't work)
with patch('tmp.my_module.MyClass',
my_method=Mock(return_value=2)):
value = my_module.create_class_call_method()
self.assertEqual(value, 2)
if __name__ == '__main__':
unittest.main()
运行test_my_module.py
的结果:
2 != <MagicMock name='MyClass().my_method()' id='140234477124048'>
Expected :<MagicMock name='MyClass().my_method()' id='140234477124048'>
Actual :2
我尝试过的其他方法:
- 与其在
patch
语句中使用..., my_method=Mock(return_value=2))
,不如像这样解包一个字典:**{'my_method.return_value': 2}
- 嵌套
with patch
语句。外部语句简单,如with patch('tmp.my_module.MyClass'):
,内部语句尝试像这样修补my_method
:with patch('tmp.my_module.MyClass.my_method, return_value=2)
- 使用修补装饰器而不是上下文管理器
- 将修补语句更改为
with patch('tmp.my_module.MyClass') as p:
,然后在with
语句内尝试设置p
,如下所示:p.evaluate = Mock(return_value=2)
希望能得到任何帮助,谢谢。
@classmethod
装饰器创建一个类方法并将其保留在类内部。(尽管它的行为会有一些不同于你实现的方式)。问题表述得很好。 - Error - Syntactical Remorsecreate_class_call_method
稍微复杂一些,实际上是由另一个类使用的,该类创建一个对象并调用其中的一个方法。因此,我认为我不能将其设置为classmethod
。 - blthayer