python-3.x - 使用 pytest 对包含某个类的实例的某个函数进行单元测试

标签 python-3.x unit-testing oop 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 .我的理解是我应该 mock 与 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 的目的似乎只是返回一个 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

关于python-3.x - 使用 pytest 对包含某个类的实例的某个函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69481486/

相关文章:

mysql - Django 操作错误(2013, "Lost connection to MySQL server during query")

Python - 检查正在使用哪个子类

python - 如何在 unittest.TestCase 中访问 unittest.main(verbosity) 设置

c# - 在此示例中如何避免破坏 LSP? C#

javascript - 将鼠标事件绑定(bind)到 JavaScript 对象

python-3.x - 类型错误 : 'function' object is not subscriptable in tensorflow

python - 如何使用xlrd写入excel文件

c# - 起订量,如何从另一个接口(interface)内部的接口(interface)验证方法

c# - 无法在单元测试中设置 AutoMapper,无法加载文件或程序集 Microsoft.AspNetCore.Mvc.ViewFeatures

language-agnostic - 什么时候面向对象不是正确的解决方案?