Как asynctest.TestCase.setUp может быть переопределен как асинхронными, так и синхронизирующими методами?

Я пишу модульный тест, который наследует от asynctest.TestCase и хотел бы создать некоторые миксины, которые выполняют асинхронныйsetUp перед каждым тестом:

import asynctest

class Mixin1(object):
    async def setUp(self): 
        await super(Mixin1, self).setUp()

class MyTest(Mixin1, asynctest.TestCase):
    async def setUp(self): 
        await super(MyTest, self).setUp()

Проблема, которую я вижу в том, что Mixin1 в конечном итоге вызывает asynctest.TestCase.setUp который оказывается не асинхронным методом, и мы получаем:

TypeError: object NoneType can't be used in 'await' expression

Очевидно, я могу просто изменить Mixin1 сделать блокирующий вызов setUp, но тогда не получится, если я введу второй миксин, который является асинхронным.

Я закончил писать все мои вызовы setUp, как это, но кажется, что должен быть лучший способ:

async def setUp(self):
    # do stuff
    setUp = super(Mixin1, self).setUp
    if asyncio.iscoroutine():
        await setUp()
    else:
        setUp()

Есть ли лучший способ связать вызовы setUp?

0 ответов

Я хотел бы предложить небольшое исправление к вашему решению, которое заставляет его работать:

async def setUp(self):
    # do stuff
    setUp = super().setUp
    if asyncio.iscoroutinefunction(setUp):
        await setUp()
    else:
        setUp()
Другие вопросы по тегам