gpt4 book ai didi

python - 检查在测试期间是否调用了 pytest fixture 一次

转载 作者:行者123 更新时间:2023-12-04 16:45:05 24 4
gpt4 key购买 nike

是否pytest提供类似 unittest.mock 的功能检查模拟是否真的被调用一次(或一次使用某个参数)?
示例源代码:my_package/my_module.py

from com.abc.validation import Validation


class MyModule:
def __init__(self):
pass

def will_call_other_package(self):
val = Validation()
val.do()

def run(self):
self.will_call_other_package()
上述源代码的示例测试代码: test_my_module.py
import pytest
from pytest_mock import mocker

from my_package.my_module import MyModule

@pytest.fixture
def mock_will_call_other_package(mocker):
mocker.patch('my_package.my_module.will_call_other_package')


@pytest.mark.usefixtures("mock_will_call_other_package")
class TestMyModule:

def test_run(self):
MyModule().run()
#check `will_call_other_package` method is called.

#Looking for something similar to what unittest.mock provide
#mock_will_call_other_package.called_once

最佳答案

如果你想使用一个进行配接的 fixture ,你可以将配接移动到一个 fixture 中:

import pytest
from unittest import mock

from my_package.my_module import MyModule

@pytest.fixture
def mock_will_call_other_package():
with mock.patch('my_package.my_module.will_call_other_package') as mocked:
yield mocked
# the mocking will be reverted here, e.g. after the test


class TestMyModule:

def test_run(self, mock_will_call_other_package):
MyModule().run()
mock_will_call_other_package.assert_called_once()
请注意,您必须在测试中使用 fixture 参数。只是使用 @pytest.mark.usefixtures不会让您访问模拟本身。如果您不需要在所有测试中访问模拟(或在 fixture 中使用 autouse=True),您仍然可以使用它在类中的所有测试中都有效。
另请注意,您不需要 pytest-mock在这里 - 但正如@hoefling 所提到的,使用它可以使 fixture 更好地可读,因为您不需要 with条款:
@pytest.fixture
def mock_will_call_other_package(mocker):
yield mocker.patch('my_package.my_module.will_call_other_package')
顺便说一句:您不需要导入 mocker .装置按名称查找,如果安装了相应的插件,则自动可用。

关于python - 检查在测试期间是否调用了 pytest fixture 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67232978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com