如何对在__init__方法外部初始化的实例变量进行单元测试

时间:2018-08-15 16:34:43

标签: python python-unittest

我有一个用ChildConstructor.[[Construct]]以外的方法初始化实例变量的类。该实例变量在this方法中进一步引用。

在下面的代码中,__init__是我正在测试的类。在__init__中,ProductionClass调用方法ProductionClass。方法__init__初始化实例变量a_methoda_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__

1 个答案:

答案 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