首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >monkeypatch需要在conftest中导入的函数

monkeypatch需要在conftest中导入的函数
EN

Stack Overflow用户
提问于 2019-03-25 21:23:16
回答 1查看 453关注 0票数 0

我正在尝试使用pytest.monkeypatch来修补我在另一个文件中定义的函数。然后,我需要修补另一个依赖于第一个monkeypatch的函数。下面是一个简单的例子

代码语言:javascript
复制
# class_def.py
class C:
    def __init__(self):
        # Normally, there is something that makes self.p
        # that will use a file that will exist on production
        raise FileNotFoundError

def factory():
    print('in factory')
    return C()

----
# function_def.py
from .class_def import factory

foo = factory()

def bar():
    return 0

----
# conftest.py
from unittest.mock import MagicMock

import pytest

import playground.class_def

@pytest.fixture(autouse=True)
def patch_c(monkeypatch):
    fake_c = MagicMock()
    def factory():
        print('in monkey factory')
        return fake_c
    monkeypatch.setattr('playground.class_def.factory', factory)

from .function_def import bar

# Then I would patch bar

并且运行pytest .将会失败,并返回FileNotFoundError。我相信这是因为我在function_def.py的顶层调用foo = factory()。我预计这不会发生,因为我在执行此导入之前正在修补factory,但这似乎没有发生。有没有办法确保这个monkeypatch.setattrconftest.py中的from .function_def import bar之前生效

此外,文件结构如下所示

代码语言:javascript
复制
playground
|--- __init__.py
|--- conftest.py
|--- class_def.py
|--- function_def
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 21:49:11

您可以直接访问要更改的属性。你根本不需要monkeypatch。

这是我的树:

代码语言:javascript
复制
$ tree .
.
├── a.py
├── b.py
├── __init__.py
└── test_a.py

0 directories, 4 files

a.py

代码语言:javascript
复制
class A:
    def __init__(self):
        raise Exception

def factory():
    return A()

b.py

代码语言:javascript
复制
import a

print(a.factory())

test_a.py

代码语言:javascript
复制
import a


def test_a():
    def fake_factory():
        return 'A'
    a.factory = fake_factory
    import b

而且它是有效的:

代码语言:javascript
复制
$ pytest
=============================================================================================== test session starts ===============================================================================================
platform linux -- Python 3.6.5, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: /home/ahorgnies/test/monkeypatch, inifile:
plugins: remotedata-0.2.1, openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2
collected 1 item                                                                                                                                                                                                  

test_a.py .                                                                                                                                                                                                 [100%]

============================================================================================ 1 passed in 0.01 seconds =============================================================================================
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55338818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档