首页 > 解决方案 > 使用 pytest 对包含某些类的实例的某些函数进行单元测试

问题描述

考虑some_module.py具有以下内容的模块(在我的实际用例中,SomeClasssome_function在单独的模块中定义):

class SomeClass:
    def __init__(self, v):
        self.some_attr = v

    def some_method(self):
        self.some_attr += self.some_attr


def some_function(val):
    c = SomeClass(val)
    c.some_method()
    return c

假设我已经SomeClass使用pytest进行了单元测试。现在我想进行单元测试some_function。我的理解是我应该嘲笑与SomeClass. 我尝试将以下测试功能添加到some_module.py

def test_some_function(mocker):
    # arrange
    c = mocker.MagicMock()
    c.some_attr = 10

    mocker.patch('some_module.SomeClass', return_value=c)
    mocker.patch('some_module.SomeClass.some_method')
    
    # act
    c = some_function(10)

    # assert
    assert c.some_attr == 20

在终端中运行pytest some_module.py(显然)会导致测试失败,就像c.some_attr10 一样。测试函数应该是什么样子?

标签: python-3.xunit-testingooppytest

解决方案


在您的示例中,因为SomeClass已经成功测试,并且由于的目的some_function似乎只是返回一个已被调用一次且仅一次的实例SomeClasssome_method因此模拟它没有意义(最好尽可能避免模拟)。

因此,我建议你some_function这样测试:

from some_module import SomeClass, some_function


def test_some_function():

    c = some_function(10)
    assert isinstance(c, SomeClass)
    assert c.some_attr == 20

    c = some_function(-10)
    assert isinstance(c, SomeClass)
    assert c.some_attr == -20

    c = some_function(0)
    assert isinstance(c, SomeClass)
    assert c.some_attr == 0

推荐阅读