unittest异步模拟不适用于pytest吗?

问题描述

async def test_coro(id):
    print("pass")

async def test_coro2():
    print("pass")

async def mock_test_coro(id):
    print("pass")

async def mock_test_coro2():
    print("hj")

class Test(AioHTTPTestCase):
    async def get_application(self):
        app = web.Application(debug=True)
        return app

   @unittest_run_loop
   @patch(__name__ + '.test_coro',side_effect=(lambda id: mock_test_coro(id)))
   @patch(__name__ + '.test_coro2',side_effect=(lambda: mock_test_coro2()))
   async def test_1(self,test_coro,test_coro2):
       await test_coro2()
       await test_coro(0)

我在此测试中失败,因为(无参数)

> test_coro = <Asyncmock name='test_coro2' id='139942609979472'>
> test_coro2 = <Asyncmock name='test_coro' id='139942609417456'>

为什么会这样? (如果有2个以上的模拟,则会以随机顺序随机播放)

对于同步功能,它工作正常

解决方法

重要的是补丁应用顺序, 最后一个参数是顶部的补丁,第一个参数是底部的补丁

   @unittest_run_loop
   @patch(__name__ + '.test_coro2',side_effect=(lambda: mock_test_coro2()))
   @patch(__name__ + '.test_coro',side_effect=(lambda id: mock_test_coro(id)))
   async def test_1(self,test_coro,test_coro2):
       await test_coro2()
       await test_coro(0)