使用 pytest 对包含某些 class 实例的某些函数进行单元测试

Unittesting some function comprising instance of some class with 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

假设我已经使用 pytestSomeClass 进行了单元测试。现在我想单元测试 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_attr 是 10。测试函数应该是什么样子?

在您的示例中,由于 SomeClass 已经成功测试并且 some_function 的目的似乎只是 return SomeClass 的一个实例some_method 只被调用过一次,没有必要嘲笑它(在可能的情况下它比 avoid mocks 更可取)。

因此,我建议你这样测试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