Multiple async unit tests fail, but running them one by one will pass

2024/10/10 14:30:36

I have two unit tests, if I run them one by one, they pass. If I run them at class level, one pass and the other one fails at response = await ac.post( with the error message: RuntimeError: Event loop is closed

@pytest.mark.asyncio
async def test_successful_register_saves_expiry_to_seven_days(self):async with AsyncClient(app=app, base_url="http://127.0.0.1") as ac:response = await ac.post("/register/",headers={},json={"device_id": "u1","device_type": DeviceType.IPHONE.value,},)query = device.select(whereclause=device.c.id == "u1")d = await db.fetch_one(query)assert d.expires_at == datetime.utcnow().replace(second=0, microsecond=0) + timedelta(days=7)@pytest.mark.asyncio
async def test_successful_register_saves_device_type(self):async with AsyncClient(app=app, base_url="http://127.0.0.1") as ac:response = await ac.post("/register/",headers={},json={"device_id": "u1","device_type": DeviceType.ANDROID.value,},)query = device.select(whereclause=device.c.id == "u1")d = await db.fetch_one(query)assert d.type == DeviceType.ANDROID.value

I have been trying for hours, what am I missing please?

Answer

UPDATE (>= 0.19.0)

Latest 0.19.0 of pytest-asyncio has become strict. You need now to change every @pytest.fixture in the conftest.py with @pytest_asyncio.fixture.

These things keep changing too often.


UPDATE (< 0.19.0)

It is true that @pytest.yield_fixture is deprecated. The proper way until version 0.19.0 is

@pytest.fixture(scope="session")
def event_loop(request):loop = asyncio.get_event_loop()yield looploop.close()

Original Answer:

I have found the solution.

Create a file named conftest.py under tests

And insert the following:

@pytest.yield_fixture(scope="session")
def event_loop(request):"""Create an instance of the default event loop for each test case."""loop = asyncio.get_event_loop_policy().new_event_loop()yield looploop.close()

This will correctly end the loop after each test and allow multiple ones to be run.

https://en.xdnf.cn/q/69881.html

Related Q&A

Pyusb on Windows 7 cannot find any devices

So I installed Pyusb 1.0.0-alpha-1 Under Windows, I cannot get any handles to usb devices.>>> import usb.core >>> print usb.core.find() NoneI do have 1 usb device plugged in(idVendor=…

How to speed up nested for loops in Python

I have the following Python 2.7 code:listOfLists = [] for l1_index, l1 in enumerate(L1):list = []for l2 in L2:for l3_index,l3 in enumerate(L3):if (L4[l2-1] == l3):value = L5[l2-1] * l1[l3_index]list.ap…

Folium Search Plugin No Results for FeatureGroup

Im trying to add search functionality to a map Im generating in Python with Folium. I see there is a handy Search plugin available and able to implement it successfully and get it added to the map. Unf…

writing dictionary of dictionaries to .csv file in a particular format

I am generating a dictionary out of multiple .csv files and it looks like this (example):dtDict = {AV-IM-1-13991730: {6/1/2014 0:10: 0.96,6/1/2014 0:15: 0.92,6/1/2014 0:20: 0.97},AV-IM-1-13991731: {6/1…

How to import SSL certificates for Firefox with Selenium [in Python]?

Trying to find a way to install a particular SSL certificate in Firefox with Selenium, using the Python WebDriver and FirefoxProfile. We need to use our own, custom certificate which is stored in the …

Cell assignment of a 2-dimensional Matrix in Python, without numpy

Below is my script, which basically creates a zero matrix of 12x8 filled with 0. Then I want to fill it in, one by one. So lets say column 2 row 0 needs to be 5. How do I do that? The example below sh…

Fill matplotlib subplots by column, not row

By default, matplotlib subplots are filled by row, not by column. To clarify, the commandsplt.subplot(nrows=3, ncols=2, idx=2) plt.subplot(nrows=3, ncols=2, idx=3)first plot into the upper right plot o…

Find the 2nd highest element

In a given array how to find the 2nd, 3rd, 4th, or 5th values? Also if we use themax() function in python what is the order of complexity i.e, associated with this function max()?.def nth_largest(…

pandas data frame - select rows and clear memory?

I have a large pandas dataframe (size = 3 GB):x = read.table(big_table.txt, sep=\t, header=0, index_col=0)Because Im working under memory constraints, I subset the dataframe:rows = calculate_rows() # a…

How do I format a websocket request?

Im trying to create an application in Python that powers a GPIO port when the balance of a Dogecoin address changes. Im using the websocket API here and this websocket client.My code looks like this:fr…