【发布时间】:2020-06-24 07:32:27
【问题描述】:
我有一个类 MyClass 和一个复杂的 __init__ 函数。
这个类有一个我想测试的方法my_method(self)。
my_method 只需要类实例中的属性my_attribute。
有没有一种方法可以模拟类实例而不调用__init__,而是设置每个类实例的属性?
我有什么:
# my_class.py
from utils import do_something
class MyClass(object):
def __init__(self, *args, **kwargs):
# complicated function which I would like to bypass when initiating a mocked instance class
pass
def my_method(self):
return do_something(self.my_attribute)
我尝试了什么
@mock.patch("my_class.MyClass")
def test_my_method(class_mock, attribute):
instance = class_mock.return_value
instance.my_attribute = attribute
example_instance = my_class.MyClass()
out_my_method = example_instance.my_method()
# then perform some assertions on `out_my_method`
但是这仍然使用__init__,我希望我们可以绕过或模拟。
【问题讨论】:
-
我想说把你复杂的东西放到
__init__中调用的另一个函数中,你可以简单地模拟它。 -
一种简单的方法是
MyClass.my_method(any_object_with_my_attribute)(即调用类上的方法并提供您自己的“实例”),但您遇到的问题表明问题出在 MyClass 的设计和任何快速修复只是一种解决方法,不能解决问题。你能提供更多背景信息吗? -
@KlausD。这个想法是有效的,但理想情况下,我会避免改变主代码的结构
-
@jonrsharpe init 函数从磁盘加载文件以及我在另一个单元测试中负责的其他事情。在这种情况下,我想测试每个类方法,而不必实例化一个类实例。答案提供了一种清晰易读的方式来实施您的建议。
-
“我想在不必实例化类实例的情况下测试每个类方法” - 这再次表明设计不佳。例如,您可以将文件的加载拆分为一个类方法,因此实际的
__init__只需使用 data -MyClass.from_file("path/to/file")。
标签: python unit-testing mocking pytest