我有一个用ChildConstructor.[[Construct]]
以外的方法初始化实例变量的类。该实例变量在this
方法中进一步引用。
在下面的代码中,__init__
是我正在测试的类。在__init__
中,ProductionClass
调用方法ProductionClass
。方法__init__
初始化实例变量a_method
。 a_method
使用inst_var_2
来设置另一个实例变量inst_var_2
。
__init__
我正在尝试对inst_var_3
的{{1}}方法进行单元测试,由于缺少实例变量class LibraryClass(object):
def __init__(self):
self.some_attrib = "some_attrib_value"
class ProductionClass(object):
def __init__(self, arg_one):
self.inst_var_1 = arg_one
self.a_method()
self.inst_var_3 = self.inst_var_2.some_attrib
def a_method(self):
self.inst_var_2 = LibraryClass()
import unittest
from unittest.mock import patch, MagicMock
class ProdTestCase(unittest.TestCase):
@patch.object(ProductionClass, 'a_method')
def test_init_method(self, mock_method):
instance = ProductionClass(1234)
self.assertEqual(1234, instance.inst_var_1)
mock_method.assert_called_once_with()
,我无法创建__init__
的实例。这是错误消息:
ProductionClass
我的问题是,在嘲笑ProductionClass
时是否可以对inst_var_2
方法进行单元测试。我想模拟Traceback (most recent call last):
...
File "/... production_class.py", line 9, in __init__
self.inst_var_3 = self.inst_var_2.some_attrib
AttributeError: 'ProductionClass' object has no attribute 'inst_var_2'
,因为我不希望该方法实例化__init__
。
答案 0 :(得分:2)
您的问题基本上与python mock - patching a method without obstructing implementation相同。
由于您模拟了a_method
,因此无法设置self.inst_var_2
。因此__init__
无法成功。您必须在测试中考虑到这一点,但是,您仍然可以断言该模拟被称为:
@patch.object(ProductionClass, 'a_method')
def test_init_method(self, mock_method):
with self.assertRaises(AttributeError):
ProductionClass(1234):
mock_method.assert_called_once_with()
我想模拟
a_method
,因为我不希望该方法实例化LibraryClass
。
最好修补your_module.LibraryClass
,而不修补a_method
。