Pola pengujian yang disarankan memerlukan duplikasi boilerplate kode aplikasi dan tidak menunjukkan pengujian aplikasi secara langsung.
https://docs.aiohttp.org/en/stable/testing.html#pytest
Saya harus dapat meneruskan modul aplikasi saya langsung ke test_client
untuk menguji aplikasi saya.
Dokumen menunjukkan pembuatan aplikasi dari penangan dengan cepat sebelum setiap pengujian. Melewati app
langsung ke test_client
berfungsi dengan baik pertama kali, kemudian gagal dengan "RuntimeError: instance web.Application diinisialisasi dengan loop berbeda".
# handler.py
async def foo():
return 'foo'
# app.py
from aiohttp import web
from .handler import foo
app = web.Application()
app.add_routes([web.get('/foo/', foo)])
# test.py
from .app import app
async def test_foo_status(test_client):
response = await client.get('/foo/')
assert response.status == 200
async def test_foo_body(test_client):
response = await client.get('/foo/')
body = await response.text()
assert body == 'foo'
Saya meretas masalah untuk saat ini dengan mengintip kode sumber dan menentukan penyebab kesalahan.
if self._loop is not None and self._loop is not loop:
raise RuntimeError(
"web.Application instance initialized with different loop")
https://github.com/aio-libs/aiohttp/blob/e561eaa/aiohttp/web_app.py#L134
Tidak segera jelas bagi saya mengapa kode ini diperlukan. Saya tidak dapat menemukan konteks apa pun dalam sejarah git. Menyetel app._loop = None
dalam metode pembersihan pengujian saya tampaknya menghindari masalah tanpa efek samping negatif. Apakah kode ini benar-benar diperlukan? Bisakah perbaikan ini diintegrasikan ke dalam test_client
?
Application
adalah objek stateful, itu harus dibuat ulang untuk setiap pengujian dari unit test suite.
Masa pakai aplikasi harus lebih pendek dari acara loop.
Petunjuk: ganti app.app
dengan async def app.make_app()
coroutine yang mengembalikan aplikasi baru pada setiap panggilan.
Tambahkan def make_app()
ke app.py
? Itu masuk akal.
Tornado FWIW mempromosikan pola make_app()
dalam contoh pertama mereka. Saya tidak berpikir mengejek aplikasi dalam file pengujian adalah pola yang baik untuk dipromosikan oleh dokumen.
Sejujurnya saya tidak berpikir mengejek objek aiohttp
adalah pola yang baik
Utas ini telah dikunci secara otomatis karena tidak ada aktivitas terbaru setelah ditutup. Silakan buka [masalah baru] untuk bug terkait.
Jika Anda merasa ada poin penting yang dibuat dalam diskusi ini, harap sertakan kutipan tersebut ke dalam [edisi baru] itu.
Komentar yang paling membantu
Application
adalah objek stateful, itu harus dibuat ulang untuk setiap pengujian dari unit test suite.Masa pakai aplikasi harus lebih pendek dari acara loop.
Petunjuk: ganti
app.app
denganasync def app.make_app()
coroutine yang mengembalikan aplikasi baru pada setiap panggilan.