μ μλ ν μ€νΈ ν¨ν΄μλ μ± μ½λμ μμ©κ΅¬ μ€λ³΅μ΄ νμνλ©° μ± ν μ€νΈλ₯Ό μ§μ νμνμ§ μμ΅λλ€.
https://docs.aiohttp.org/en/stable/testing.html#pytest
λ΄ μ±μ ν
μ€νΈνλ €λ©΄ λ΄ μ± λͺ¨λμ test_client
μ μ§μ μ λ¬ν μ μμ΄μΌ ν©λλ€.
λ¬Έμλ κ° ν
μ€νΈ μ μ μ¦μμμ νΈλ€λ¬μμ μ±μ λΉλνλ λ°©λ²μ 보μ¬μ€λλ€. μ€μ app
λ₯Ό test_client
app
μ§μ μ λ¬νλ©΄ μ²μμλ μ λλ‘ μλν λ€μ "RuntimeError: web.Application instance initialized with different loop"μ ν¨κ» μ€ν¨ν©λλ€.
# 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'
λλ μ§κΈ μμ€ μ½λλ₯Ό μΏλ³΄κ³ μ€λ₯μ μμΈμ νμ νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
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
μ΄ μ½λκ° νμν μ΄μ λ μ¦μ λͺ
ννμ§ μμ΅λλ€. μμ κΈ°λ‘μμ 컨ν
μ€νΈλ₯Ό μ°Ύμ μ μμ΅λλ€. λ΄ ν
μ€νΈ μ 리 λ°©λ²μμ app._loop = None
λ₯Ό μ€μ νλ©΄ λΆμ μ μΈ λΆμμ© μμ΄ λ¬Έμ λ₯Ό νΌν μ μλ κ² κ°μ΅λλ€. μ΄ μ½λκ° μ€μ λ‘ νμνκ°μ? μ΄ μμ μ¬νμ test_client
ν΅ν©ν μ μμ΅λκΉ?
Application
λ μν μ μ₯ κ°μ²΄μ΄λ―λ‘ λ¨μ ν
μ€νΈ λͺ¨μμ λͺ¨λ ν
μ€νΈμ λν΄ λ€μ λ§λ€μ΄μΌ ν©λλ€.
μ ν리μΌμ΄μ
μ μλͺ
μ μ΄λ²€νΈ 루νμ μλͺ
λ³΄λ€ μ§§μμΌ ν©λλ€.
ννΈ: app.app
λ₯Ό νΈμΆν λλ§λ€ μ μ±μ λ°ννλ async def app.make_app()
μ½λ£¨ν΄μΌλ‘ λ°κΎΈμΈμ.
def make_app()
μ app.py
νμκ² μ΅λκΉ? κ·Έκ²μ μλ―Έκ° μμ΅λλ€.
FWIW ν λ€μ΄λλ 첫 λ²μ§Έ μμμ make_app()
ν¨ν΄μ μ΄μ§ν©λλ€. ν
μ€νΈ νμΌμμ μ±μ μ‘°λ‘±νλ κ²μ λ¬Έμκ° ν보νκΈ°μ μ’μ ν¨ν΄μ΄ μλλΌκ³ μκ°ν©λλ€.
μμ§ν μ λ aiohttp
κ°μ²΄λ₯Ό μ‘°λ‘±νλ κ²μ΄ μ’μ ν¨ν΄μ΄λΌκ³ μκ°νμ§ μμ΅λλ€.
μ΄ μ€λ λλ λ«ν ν μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ κ²Όμ΅λλ€. κ΄λ ¨ λ²κ·Έλ [μ κ°νΈ]λ₯Ό μ΄μ΄μ£ΌμΈμ.
μ΄ ν λ‘ μμ μ€μν μμ μ΄ μλ€κ³ μκ°λλ©΄ ν΄λΉ λ΄μ©μ [μ λ¬Έμ ]μ ν¬ν¨μν€μμμ€.
κ°μ₯ μ μ©ν λκΈ
Application
λ μν μ μ₯ κ°μ²΄μ΄λ―λ‘ λ¨μ ν μ€νΈ λͺ¨μμ λͺ¨λ ν μ€νΈμ λν΄ λ€μ λ§λ€μ΄μΌ ν©λλ€.μ ν리μΌμ΄μ μ μλͺ μ μ΄λ²€νΈ 루νμ μλͺ λ³΄λ€ μ§§μμΌ ν©λλ€.
ννΈ:
app.app
λ₯Ό νΈμΆν λλ§λ€ μ μ±μ λ°ννλasync def app.make_app()
μ½λ£¨ν΄μΌλ‘ λ°κΎΈμΈμ.