如何在修补时引用本地导入-正确的python测试结构
我有一个Starlete应用程序,我正在尝试对整个应用程序执行端到端测试。A.py中定义的函数由b.py中的函数通过本地导入调用,出于测试目的,我想在测试时用自定义函数替换该函数 和其他人一样,我在使用路径字符串时遇到了一些问题。在查看了有关stackoverflow的现有问题后,我认为我应该在b.py中修补引用,但遇到以下错误如何在修补时引用本地导入-正确的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
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