我试图在@pytest.fixture中设置测试目标,并在模块中的所有测试中使用它.我能够正确地修补测试,但在添加@pytest.fixture以返回模拟对象并在其他单元测试中调用模拟对象后,该对象开始引用原始函数.

以下是我的代码.我原以为单元测试中的mocked_worker会引用返回值,但它会调用实际的os.getcwd方法.

请帮我更正代码:

import os
import pytest
from unittest.mock import patch

class Worker:
    def work_on(self):
        path = os.getcwd()
        print(f'Working on {path}')
        return path

@pytest.fixture()
def mocked_worker():
    with patch('test.test_module.os.getcwd', return_value="Testing"):
        result = Worker()
    return result

def test_work_on(mocked_worker):
    ans = mocked_worker.work_on()
    assert ans == "Testing"

推荐答案

问题是,当worker返回"with"语句的作用域,使对象获取其实际值时,解决方案是使用"yield".

@pytest.fixture()
def mocked_worker():
    with patch('test.test_module.os.getcwd', return_value="Testing"):
        result = Worker()
        yield result

Python-3.x相关问答推荐

如何在输入正确的用户名和密码时添加按钮?

错误:无法为 pyconcorde 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

Sunburst 折线图可视化

提取图像中的背景并保存

Python BeautifulSoup:在 Select 语句中排除其他标签

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

使用一周的特定第一天将每日日期转换为每周

参数化泛型不能与类或实例判断一起使用

PySpark python 问题:Py4JJavaError: An error occurred while calling o48.showString

'~'(波浪号)运算符在 Python 中的应用

使用 Sympy 方程进行绘图

在 Pandas 数据框中显示对图

如果一个失败,如何取消收集中的所有剩余任务?

使用 urllib3 忽略证书验证

SQLAlchemy:如果不存在则创建模式

为什么 Python 不能识别我的 utf-8 编码源文件?

如何将文档字符串放在 Enums 上?

哪个更有效:Python 文档字符串还是类型提示?

finally 总是在 try 块返回之前运行,那么为什么 finally 块中的更新不会影响 try 块返回的变量的值呢?

在 Visual Studio Code 中调试 Scrapy 项目