इस यूनिट टेस्ट में मैं यह जांचना चाहूंगा कि क्या डिवाइस बनाया गया है और भविष्य में एक्सपायरी डेट 7 दिन है।
database.py
import databases
database = databases.Database(settings.sqlalchemy_database_uri)
अध्याय परीक्षा:
from database.database import database
def test_successful_register_expiry_set_to_seven_days():
response = client.post(
"/register/",
headers={},
json={"device_id": "u1"},
)
assert response.status_code == 201
query = device.select(whereclause=device.c.id == "u1")
d = database.fetch_one(query)
assert d.expires_at == datetime.utcnow().replace(microsecond=0) + timedelta(days=7)
क्योंकि d
एक कोरटाइन ऑब्जेक्ट है, यह संदेश के साथ विफल हो जाता है:
AttributeError: 'coroutine' object has no attribute 'expires_at'
और मैं एक इकाई परीक्षण के अंदर await
का उपयोग नहीं कर सकता।
d = await database.fetch_one(query)
मुझे क्या याद आ रहा है, कृपया?
1 उत्तर
वैसे यह कभी भी प्रतीक्षित नहीं है, आपका कोड शेड्यूलर में जाने वाले सेमाफोर से पहले कोरआउटिन लौटाता है।
यदि आप एक एसिंक्रोनस ड्राइवर का उपयोग कर रहे हैं, तो आपको इसकी प्रतीक्षा करने की आवश्यकता है। क्या इसके लिए कोई उपाय हैं? हां।
आप asyncio.run(awaitable)
का उपयोग किसी ईवेंट लूप के अंदर coroutine चलाने के लिए कर सकते हैं।
import asyncio
d = asyncio.run(database.fetch_one(query))
यदि आपके पास वर्तमान में चल रहा ईवेंट लूप है, तो आप इसके बजाय उस ईवेंट लूप का उपयोग करना चाह सकते हैं। आप इसे asyncio.get_event_loop()
द्वारा प्राप्त कर सकते हैं, जो चल रहे लूप के अंदर फ़ंक्शन चलाएगा।
import asyncio
asyncio.get_event_loop().run_until_complete(database.fetch_one(query))
आप @pytest.mark.asyncio
डेकोरेटर का भी उपयोग कर सकते हैं (देखें दस्तावेज़ीकरण)।
@pytest.mark.asyncio
async def dummy():
await some_awaitable()
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
RuntimeError: Task <Task pending name='Task-4' coro=<Database.fetch_one() running at /Users/houmie/.pyenv/versions/v391/lib/python3.9/site-packages/databases/core.py:146> cb=[_run_until_complete_cb() at /Users/houmie/.pyenv/versions/3.9.1/lib/python3.9/asyncio/base_events.py:184]> got Future <Future pending> attached to a different loop
asyncio.get_event_loop().run_until_complete(database.fetch_one(query))
. यदि यह काम नहीं करता है, तो आपpytest.mark_asyncio
भी आजमा सकते हैं।@pytest.mark.asyncio
अभी भीRuntimeError: This event loop is already running
फेंकता है। लेकिन दूसरा उपाय काम कर गया। आप अपना उत्तर अपडेट करना चाह सकते हैं। धन्यवाद (यदि आपके पास@pytest.mark.asyncio
के साथ इसे और सरल बनाने का विचार है तो मैं जानना चाहूंगा। :)