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

但是,如果您需要这样做,那么代码中就会出现问题。