Aiohttp: Uji Kesalahan Loop Klien dengan Aplikasi Sebenarnya

Dibuat pada 17 Agu 2018  ·  4Komentar  ·  Sumber: aio-libs/aiohttp

Singkat cerita

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

Perilaku yang diharapkan

Saya harus dapat meneruskan modul aplikasi saya langsung ke test_client untuk menguji aplikasi saya.

Perilaku sebenarnya

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".

Langkah-langkah untuk mereproduksi

# 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'

Lingkungan Anda

  • OS: Ubuntu 18.04
  • Python: 3.6.5
  • aiohttp: 3.3.2

Bekerja di sekitar

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 ?

outdated

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 dengan async def app.make_app() coroutine yang mengembalikan aplikasi baru pada setiap panggilan.

Semua 4 komentar

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.

http://www.tornadoweb.org/en/stable/#hello -world

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat