我正在用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作为一些列表1、列表2和self的函数进行测试.相关信息组合.我更愿意不必实例化MyClass的真实对象,因为在逻辑链的其他地方有一些耗时的计算,我无法轻松创建具有我想要测试的self.relevant_info个值的完整范围的对象.

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

具体来说,我们可以假设_method_of_interest是:

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

我在哪里.相关的_info是一个python set()对象.

有什么建议吗?网上有很多关于模仿、修补等的内容,但这些例子看起来都比我的 case 更复杂,解决问题的各种方法让我不确定哪种方法最干净.

推荐答案

如果你想测试一个与类的其他部分完全隔离的方法,你可以通过mock self:

# 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永远不会被实例化.

Python相关问答推荐

Plotly:如何更改Heatmap中彩色条的勾选文本

强制venv在bin而不是收件箱文件夹中创建虚拟环境

剧作家Python:expect(locator).to_be_visible()vs locator.wait_for()

如何通过多2多字段过滤查询集

在Pandas 日历中插入一行

如何使用pandasDataFrames和scipy高度优化相关性计算

大小为M的第N位_计数(或人口计数)的公式

两个pandas的平均值按元素的结果串接元素.为什么?

运输问题分支定界法&

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

ThreadPoolExecutor和单个线程的超时

形状弃用警告与组合多边形和多边形如何解决

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

当点击tkinter菜单而不是菜单选项时,如何执行命令?

如何在turtle中不使用write()来绘制填充字母(例如OEG)

如何指定列数据类型

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

使用类型提示进行类型转换

获取PANDA GROUP BY转换中的组的名称

如何编辑此代码,使其从多个EXCEL文件的特定工作表中提取数据以显示在单独的文件中