Mocking/patching 一个对象属性来测试一个方法(还需要访问其他 class 方法)
Mocking/patching an object attribute to test a method (also need access to other class methods)
我有一个class的方法,我想用pytest测试一下,比如下面的方法_method_of_interest
。
class MyClass():
def __init__(self, stuff):
...
..
..
def _method_of_interest(self, list1, list2):
"""
some logic that depends on list1, list2, and self.relevant_info
Also calls self._helper_method(list)
"""
output = list1 + list2 + self._helper_method(list2) + self.relevant_info
return output
def _helper_method(self, lista):
"""
Helper method depends on lista and self.relevant_info
"""
return lista + self.relevant_info
我希望能够使用 list1、list2 和 self.relevant_info 的不同值测试 _method_of_interest
。所以我主要需要能够为 self.relevant_info
指定一个值。使用 Python 最干净的方法是什么?
最简单的方法是使用内置 unittest 框架。
定义多个测试用例。在每个中,您创建一个新的 MyClass 对象,其中包含为该测试定义的 stuff
。然后将 my_class._method_of_interest 的输出与某些预定义的预期输出进行比较(使用 unittest.TestCase 的 assertEqual 方法)。当然,您可以针对多个不同的列表 1&2 进行多次测试。
编辑:
如果你不能通过构造函数本身设置 relevant_info
那么你总是可以手动调整它。 Class 属性在 python 中不受保护,no-one 可以阻止你做:
my_class = MyClass(unrelevant_info)
my_class.relevant_info = relevant_info
但是,如果您需要这样做,那么代码中就会出现问题。
我有一个class的方法,我想用pytest测试一下,比如下面的方法_method_of_interest
。
class MyClass():
def __init__(self, stuff):
...
..
..
def _method_of_interest(self, list1, list2):
"""
some logic that depends on list1, list2, and self.relevant_info
Also calls self._helper_method(list)
"""
output = list1 + list2 + self._helper_method(list2) + self.relevant_info
return output
def _helper_method(self, lista):
"""
Helper method depends on lista and self.relevant_info
"""
return lista + self.relevant_info
我希望能够使用 list1、list2 和 self.relevant_info 的不同值测试 _method_of_interest
。所以我主要需要能够为 self.relevant_info
指定一个值。使用 Python 最干净的方法是什么?
最简单的方法是使用内置 unittest 框架。
定义多个测试用例。在每个中,您创建一个新的 MyClass 对象,其中包含为该测试定义的 stuff
。然后将 my_class._method_of_interest 的输出与某些预定义的预期输出进行比较(使用 unittest.TestCase 的 assertEqual 方法)。当然,您可以针对多个不同的列表 1&2 进行多次测试。
编辑:
如果你不能通过构造函数本身设置 relevant_info
那么你总是可以手动调整它。 Class 属性在 python 中不受保护,no-one 可以阻止你做:
my_class = MyClass(unrelevant_info)
my_class.relevant_info = relevant_info
但是,如果您需要这样做,那么代码中就会出现问题。