我试图在@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相关问答推荐

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

Paramiko SFTPClient get()和put()函数的通过/失败结果?

将列表项的极列水平分解为新列

合并两个数据帧并对某些总和进行求和

GUI 仍然有效并且没有错误消息时图形意外冻结 |具有多线程的 Pyside6 和 pyqtgraph (Python 3.11.4)

如何使用 Selenium Python 连续单击一个按钮直到另一个元素出现?

在REPLACE INTO中引用变量会抛出sqlite3.OperationalError

如果值超出上下限(异常值处理),则将值的数据框替换为 np.nan

Pandas DataFrame:使用 Pandas 将 NaN 值替换为 3 行以上的平均值

Python:pprint的模块错误,打印没有错误

Visual Studio Code 中的 Python 3.x 类型提示

基本 Flask 应用程序未运行(TypeError:模块中缺少必填字段type_ignores)

如何为 Python 中的线程设置异步事件循环?

为什么 Django South 1.0 使用 iteritems()?

如何用pymongo连接远程mongodb

AttributeError:系列对象没有属性iterrows

带百分号的 Python 字符串格式

类型提示返回 NameError: name 'datetime' not defined

如何使用请求发送带有标头的 PATCH 请求

如何在 Pandas 中的超 Big Data 框上创建数据透视表