微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 pytest-mock 的会话范围

如何解决带有 pytest-mock 的会话范围

我正在寻找如何使用 pytest-mock 插件的会话范围“会话模拟”装置的示例。

如何修改文档提供的示例以在特定测试中使用它是相当清楚的:

def test_foo(session_mocker):
    session_mocker.patch('os.remove')
    etc...

但是我对这个全局装置应该在哪里以及如何初始化感到困惑。例如,假设我想为我的所有测试模拟“os.remove”。我是否在 conftest.py 中进行了设置?如果是,我该怎么做?

解决方法

您在具有会话范围的装置中使用它。放置它的最佳位置是 conftest.py。这主要是为了让其他程序员清楚这个装置的存在以及它可能在做什么。这很重要,因为此装置会影响其他可能不一定了解或什至不想要此装置的测试。

我不建议在会话期间嘲笑某些东西。测试、类甚至模块,是的。但不是会话。

例如,以下测试 test_normal 通过或失败取决于 test_mocked 是否在同一会话中运行。由于它们在同一个“文件”中,因此更容易发现问题。但是这些测试可能位于不同的测试文件中,看起来并不相关,但如果两个测试都在同一个会话中运行,就会出现问题。

import pytest

# could be in conftest.py
@pytest.fixture(scope='session')
def myfixture(session_mocker):
    session_mocker.patch('sys.mymock',create=True)

def test_mocked(myfixture):
    import sys
    assert hasattr(sys,'mymock')

def test_normal():
    import sys
    assert not hasattr(sys,'mymock')

相反,只需创建一个作用域为测试、类或模块的夹具,并将其直接包含在测试文件中。这样,行为就包含在需要它的一组测试中。 Mock 的创建成本很低,因此为每个测试重新创建 Mock 没什么大不了的。这甚至可能是有益的,因为每次测试都会重置模拟。

为设置成本高、没有状态或测试不会改变其状态的事物保存会话装置(例如,用作模板以创建每个测试将运行的新数据库的数据库)反对)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。