我正在用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
从未被实例化。