Aiohttp: Ошибка Ρ†ΠΈΠΊΠ»Π° тСстового ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° с фактичСским ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 17 Π°Π²Π³. 2018  Β·  4ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: aio-libs/aiohttp

ΠšΠΎΡ€ΠΎΡ‡Π΅

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΉ шаблон тСстирования Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ стандартного дублирования ΠΊΠΎΠ΄Π° прилоТСния ΠΈ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ тСстированиС прилоТСния Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

https://docs.aiohttp.org/en/stable/testing.html#pytest

ОТидаСмоС повСдСниС

Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ свой ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прилоТСния Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ test_client для тСстирования ΠΌΠΎΠ΅Π³ΠΎ прилоТСния.

ЀактичСскоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ созданиС прилоТСния ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² "Π½Π° Π»Π΅Ρ‚Ρƒ" ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ тСстом. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ app нСпосрСдствСнно Π² test_client Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·, Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ошибкой "RuntimeError: экзСмпляр web.Application ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ".

ДСйствия ΠΏΠΎ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ

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

Π’Π°ΡˆΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

  • ОБ: Ubuntu 18.04
  • Python: 3.6.5
  • aiohttp: 3.3.2

Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²ΠΎΠΊΡ€ΡƒΠ³

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я Ρ€Π΅ΡˆΠΈΠ» ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, заглянув Π² исходный ΠΊΠΎΠ΄ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки.

        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

МнС Π½Π΅ сразу понятно, Π·Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΅Π½ этот ΠΊΠΎΠ΄. Π― Π½Π΅ смог Π½Π°ΠΉΡ‚ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ контСкста Π² истории git. Установка app._loop = None Π² ΠΌΠΎΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ тСстовой очистки, ΠΏΠΎΡ…ΠΎΠΆΠ΅, позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ этот ΠΊΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ? МоТно Π»ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это исправлСниС Π² test_client ?

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Application - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с отслСТиваниСм состояния, Π΅Π³ΠΎ слСдуСт Π²ΠΎΡΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ тСста ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов.
Π‘Ρ€ΠΎΠΊ слуТбы прилоТСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий.

Подсказка: Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ app.app Π½Π° async def app.make_app() coroutine, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

ВсС 4 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Application - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с отслСТиваниСм состояния, Π΅Π³ΠΎ слСдуСт Π²ΠΎΡΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ тСста ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… тСстов.
Π‘Ρ€ΠΎΠΊ слуТбы прилоТСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‡Π΅, Ρ‡Π΅ΠΌ Ρ†ΠΈΠΊΠ» ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий.

Подсказка: Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ app.app Π½Π° async def app.make_app() coroutine, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ def make_app() Π² app.py ? Π’ этом Π΅ΡΡ‚ΡŒ смысл.

FWIW tornado ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ‚ шаблон make_app() Π² своСм самом ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π― Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π΄Π΅Π²Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π½Π°Π΄ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² тСстовом Ρ„Π°ΠΉΠ»Π΅ - Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† для продвиТСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

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

ЧСстно говоря, я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π΄Π΅Π²Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ Π½Π°Π΄ Π»ΡŽΠ±Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ aiohttp - Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ шаблон

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π±Ρ‹Π» автоматичСски Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послС Π΅Π³ΠΎ закрытия Π² послСднСС врСмя Π½Π΅ Π±Ρ‹Π»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ [Π½ΠΎΠ²Ρ‹ΠΉ выпуск], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….
Если Π²Ρ‹ чувствуСтС, Ρ‡Ρ‚ΠΎ Π² Ρ…ΠΎΠ΄Π΅ этого обсуТдСния Π±Ρ‹Π»ΠΈ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ эти Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² этот [Π½ΠΎΠ²Ρ‹ΠΉ выпуск].

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ