如何测试Python中Project类构造函数是否传入正确参数
如何测试Python类构造函数是否传入正确参数?
你遇到的报错是因为对Mock类的调用逻辑理解有点偏差,我来帮你拆解问题并给出可行的解决方案:
首先,为什么原代码会报错?当你用MagicMock模拟Project类时,调用Project('some_data')本质是调用这个Mock类的__call__方法,而不是直接调用__init__。你直接去断言mockProject.__init__.assert_called(),但这个__init__并不是实际被触发的方法,自然会出现属性错误。
下面给你两种简单有效的测试方式:
方案一:直接验证Mock类的调用(最直观)
这种方式贴合实际代码的调用逻辑——因为你的业务代码里是直接调用Project(data)创建实例,所以我们直接验证这个类是否被传入了正确参数:
@mock.patch('module') def test_create_project_with_right_parameter(self, module_mock): # 准备测试数据和Mock对象 mock_project_class = mock.MagicMock() module_mock.Project = mock_project_class test_data = 'some_data' # 执行待测试函数 module.create_project(test_data) # 断言:Project类被调用时传入了正确的参数,且只调用了一次 mock_project_class.assert_called_once_with(test_data)
用assert_called_once_with比assert_called更严谨,它能同时验证参数正确性和调用次数,避免出现多次调用的遗漏问题。
方案二:验证实例的__init__方法(如果需要更细粒度)
如果你确实要验证实例的构造方法是否拿到了参数,可以通过Mock类的返回值(也就是实例对象)来断言:
@mock.patch('module.Project') def test_create_project_with_right_parameter(self, project_mock): test_data = 'some_data' module.create_project(test_data) # 断言实例的__init__方法被传入了正确参数 project_mock.return_value.__init__.assert_called_once_with(test_data)
这里project_mock.return_value就是Mock类创建出来的实例对象,它的__init__才是实际执行的构造方法。不过这种方式不如方案一直接,因为业务代码里我们关心的是"创建类时传对了参数",而不是实例构造方法的细节。
最后再提个小建议:测试时尽量避免空的except块(你原代码里的except:),最好捕获特定异常,这样能避免隐藏其他未知错误,让测试和代码更健壮。
内容的提问来源于stack exchange,提问作者scher
相关产品推荐
相关产品推荐

