如何在修补时引用本地导入-正确的python测试结构

如何在修补时引用本地导入-正确的python测试结构,python,mocking,pytest,monkeypatching,python-mock,Python,Mocking,Pytest,Monkeypatching,Python Mock,我有一个Starlete应用程序,我正在尝试对整个应用程序执行端到端测试。A.py中定义的函数由b.py中的函数通过本地导入调用,出于测试目的,我想在测试时用自定义函数替换该函数 和其他人一样,我在使用路径字符串时遇到了一些问题。在查看了有关stackoverflow的现有问题后,我认为我应该在b.py中修补引用,但遇到以下错误AttributeError:没有属性“a” 下面是相关的结构和代码 Project_folder - app - lib

我有一个Starlete应用程序,我正在尝试对整个应用程序执行端到端测试。A.py中定义的函数由b.py中的函数通过本地导入调用,出于测试目的,我想在测试时用自定义函数替换该函数

和其他人一样,我在使用路径字符串时遇到了一些问题。在查看了有关stackoverflow的现有问题后,我认为我应该在b.py中修补引用,但遇到以下错误
AttributeError:没有属性“a”

下面是相关的结构和代码

    Project_folder
      - app
        - lib
          + __init__.py
          + a.py
          + b.py
        - handle
          + __init__.py
      - test
        + test.py
      + main.py
routes指的是一个异步函数,它在代码的某个地方调用b

   #main.py
   from starlette.applications import Starlette
   from handle import routes

   app = Starlette(routes=routes)
我在test.py上的尝试

from starlette.testclient import TestClient
from main import app
import pytest
from mock import patch

client = TestClient(app)

def mock_a(id):
    return 'some value'

@patch('app.lib.b.a', new=mock_a)
def test_app(request):
    response = client.post('/route', request)
    assert response.status_code == 200
我对模拟和修补非常陌生,如果您能在init.py中将“a”和“b”作为函数导入,我将非常感谢您对如何设置此设置的任何建议。所以修补libs,而不是libs.a或libs.b。如果要在模块内部进行修补,请将导入从init.py中取出,然后执行以下操作:

import libs
libs.b.b = libs.a.a

对不起,我不太明白你的意思。上面的代码应该在test.py中编写吗?这会改变客户端调用的内容吗?我尝试了
@patch('app.lib.a',mock_a)
,但调用了原始的a()而不是mock_a。
   #main.py
   from starlette.applications import Starlette
   from handle import routes

   app = Starlette(routes=routes)
from starlette.testclient import TestClient
from main import app
import pytest
from mock import patch

client = TestClient(app)

def mock_a(id):
    return 'some value'

@patch('app.lib.b.a', new=mock_a)
def test_app(request):
    response = client.post('/route', request)
    assert response.status_code == 200
import libs
libs.b.b = libs.a.a