Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Pytest:Pytest_sessionstart()中的修补函数未返回预期值_Python_Pytest - Fatal编程技术网

Python/Pytest:Pytest_sessionstart()中的修补函数未返回预期值

Python/Pytest:Pytest_sessionstart()中的修补函数未返回预期值,python,pytest,Python,Pytest,我正在尝试修补Pytest的Pytest_sessionstart()中的函数。但是,我希望补丁函数返回{'SENTRY\u DSN':“error”}。我将在测试运行中返回对象 import pytest from unittest.mock import patch, Mock def pytest_sessionstart(session): """ :type request: _pytest.python.SubRequest :

我正在尝试修补Pytest的Pytest_sessionstart()中的函数。但是,我希望补丁函数返回{'SENTRY\u DSN':“error”}。我将在测试运行中返回对象

import pytest
from unittest.mock import patch, Mock

def pytest_sessionstart(session):
    """
    :type request: _pytest.python.SubRequest
    :return:

    """
    mock_my_func = patch('core.my_func')
    mock_my_func.return_value = {'SENTRY_DSN': "WRONG"}
    mock_my_func.__enter__()

    def unpatch():
        mock_my_func.__exit__()

这里的问题似乎是您没有正确配置
Mock
对象。根据您显示的代码,我假设您正在以以下方式调用某个函数:

with foobar() as fb:
    # something happens with fb here
该调用的计算结果本质上是:

foobar().__enter__()
然而,在您展示的补丁中,您犯了一些关键错误

  • 您尚未定义
    \uuuu enter\uuuu
    的返回值
  • 初始化
    Mock
    对象时,它会返回一个全新的
    Mock
    对象,因此,当您在函数末尾调用
    \uuuuuu\uuuu
    时,它会返回一个全新的对象,而不是您最初创建的对象
  • 如果我理解正确,您可能想要这样的东西:

    import pytest
    from unittest.mock import patch, Mock
    
    def pytest_sessionstart(session):
        """
        :type request: _pytest.python.SubRequest
        :return:
    
        """
        mock_my_func = patch('core.my_func')
        mock_context = Mock()
        
        mock_context.return_value = {'SENTRY_DSN': "WRONG"}
        mock_my_func.return_value.__enter__.return_value = mock_context
        
        # this now returns `mock_context`
        mock_my_func().__enter__()
    
    现在
    mock\u my\u func()。\uu enter\uu()
    返回
    mock\u context
    ,我们可以在执行以下操作时看到它按预期工作:

    with mock_my_func() as mf:
        print(mf())
    >> {'SENTRY_DSN': 'WRONG'}
    

    @gold\u cy正确地回答了这一点,因此这只是一个补充:如前所述,您正在将
    return\u值设置为
    patch
    对象,而不是模拟本身。最简单的纠正方法是使用:

    来自unittest.mock导入修补程序的
    
    def pytest_会话启动(会话):
    """
    :键入请求:_pytest.python.SubRequest
    :返回:
    """
    mock_my_func=patch('core.my_func',返回值={'SENTRY\u DSN':“错误”})
    模拟我的函数开始()
    

    这将设置模拟的返回值,而无需创建单独的
    mock
    对象。

    您还可以在调用函数
    my_func
    的位置添加代码。