模拟/修补对象属性以测试方法



我正在用pytest测试我的代码,并试图找出测试我的类的方法之一的最直接的方法。

我有一个类似的类:

class MyClass():
def __init__(self, stuff):
...
..
..
def _method_of_interest(self, list1, list2):

..some logic that depends on list1, list2, and self.relevant_info

return output 

我想测试方法_method_of_interest作为一些list1、list2和self.relevant_info组合的函数。我宁愿不必实例化MyClass的真实对象,因为在逻辑链的其他地方有一些耗时的计算,而且我无法轻松创建具有我想要测试的全部self.relevant_info值的对象。

对于我来说,用不同的list1、list2和self.relevant_info值来测试这个方法的输出,最干净的方法是什么?

对于具体性,我们可以假设_method_of_interest类似于:

def _method_of_interest(list1, list2):
return list1 + list2 + list(self.relevant_info)

其中self.relevant_info是一个python set((对象。

有指针吗?网上有很多关于嘲笑、修补等的内容,但这些例子看起来都比我的情况更复杂,解决问题的各种方法让我不确定哪种方法最干净。

如果你想测试一个与类的其他部分完全隔离的方法,你总是可以传递一个mockself:

# code under test
class MyClass():
def __init__(self):
raise NotImplementedError  # don't instantiate me!
def _method_of_interest(self, list1, list2):
return list1 + list2 + list(self.relevant_info)

# test
from unittest.mock import Mock
def test_method_of_interest():
assert MyClass._method_of_interest(
Mock(relevant_info=[3]), [1], [2]
) == [1, 2, 3]

如果您运行测试,您将看到它通过了,并且MyClass从未被实例化。

最新更新