Макет asyn c, следующий за syn c метод Повышение # AttributeError: у объекта 'сопрограммы' нет атрибута 'to_list' - PullRequest
0 голосов
/ 21 апреля 2020

Ниже приведен пример кода python, который я не смог понять, почему, если я включу метод syn c после ожидаемой асинхронной функции c, результатом будет AttributeError. Если я переписываю тот же код и разбиваю ожидаемый метод asyn c и syn c на две отдельные строки, то все в порядке. Пожалуйста помоги. Спасибо

    """ sample test code to demonstrate challenge for unit testing async method followed by sync method """
    import asyncio
    import unittest

    from mock import AsyncMock, MagicMock


    class Test(unittest.TestCase):
        """ a test class """

        async def bad_method(self, query):
            """ this method is going to fail """

            return await query.find().to_list()
            # AttributeError: 'coroutine' object has no attribute 'to_list'

        async def good_method(self, query):
            """ this method should be identical to bad method but magically works """

            result = await query.find()
            return result.to_list()

        def test_bad_method(self):
            """ test bad method, and this is going to fail """
            query = self.prepare_query()
            result = asyncio.get_event_loop().run_until_complete(self.bad_method(query))
            print(result)

        def test_good_method(self):
            """ test good method, this is going to pass """
            query = self.prepare_query()
            result = asyncio.get_event_loop().run_until_complete(self.good_method(query))
            print(result)

        def prepare_query(self):
            """ prepare mock query """
            async_result = MagicMock()
            async_result.to_list = MagicMock(return_value="this is the result")
            query = MagicMock()
            query.find = AsyncMock(return_value=async_result)
            return query


    if __name__ == "__main__":
        unittest.main()

...