如何在内部调用 sanic asyncio rest 端点以进行测试

How to call the sanic asyncio rest endpoint internally for testing purpose

下面是sanic的一个简单例子

from sanic import Sanic
from sanic import response as res

app = Sanic(__name__)


@app.route("/")
async def test(req):
    return res.text("I\'m a teapot", status=418)


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8000)

现在,这将打开我发送请求的端口 8000。取而代之的是,我可以在相同的 python 代码中在内部调用 test(req) 吗,比如:

from sanic import Sanic
from sanic import response as res

## generating some data
req = generate_data()

app = Sanic(__name__)


@app.route("/")
async def test(req):
    return res.text("I\'m a teapot", status=418)


if __name__ == '__main__':
    app.call(test(req))   ????????????????
    #app.run(host="0.0.0.0", port=8000)

为了测试,我可以做类似 app.call(test(req)) 的事情,这样生成的相同 'req' 数据可以传递给 sanic api 而无需任何 HTTP开销?

答案is in the docs.

内置了两个测试客户端。同步版本支持应用程序并提交http请求。异步版本避免了利用 ASGI 到达内部并执行处理程序。听起来这就是你想要的。

request, response = await app.asgi_client.put('/')