第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修補異步類方法?

如何修補異步類方法?

慕標琳琳 2021-04-02 10:11:22
我正在處理以下問題,我有一個類,我想模擬其補丁的異步方法:class ExampleClass:    async def asy_method(self, param):        return await some_coroutine(self, param)example_instance = ExampleClass()我只想打補丁await example_instance.asy_method('test_param')通常我會用mocker.patch('ExampleClass.asy_method', new_callable=AsyncMock)其中,mocker是pytest-mock插件的固定裝置,而AsyncMock具有以下形式class AsyncMock(mock.MagicMock):    async def __call__(self, *args, **kwargs):         return super(AsyncMock, self).__call__(*args, **kwargs)這會給我一個Mock對象,它在調(diào)用時的行為像協(xié)程。問題是,我想訪問self傳遞給方法的屬性。self僅在您進行設置的情況下才傳遞給模擬對象 autospec=True(另請參閱Python Doc,了解如何修補未綁定的方法),您不能與一起使用new_callable。有誰知道如何解決這個問題?
查看完整描述

1 回答

?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

確實,您不能混合使用自動指定和新的可調(diào)用項。相反,可以自動指定方法,然后替換side_effect屬性,并為其指定一個AsyncMock()實例:


from unittest import mock



def configure_coroutine_mock(mock_function, klass=AsyncMock):

    """Make an autospecced async function return a coroutine mock"""

    mock_function.side_effect = AsyncMock()

    # mark the side effect as a child of the original mock object

    # so transitive access is recorded on the parent mock too. This is 

    # what .return_value does normally

    mock._check_and_set_parent(

        mock_function.mock, mock_function.side_effect,

        None, '()')

    return mock_asy_method.side_effect



with mocker.patch('ExampleClass.asy_method', autospec=True) as mock_asy_method:

    configure_coroutine_mock(mock_asy_method)

因為AsyncMock()是可調(diào)用的對象,所以每次mock_asy_method調(diào)用都會調(diào)用,并將參數(shù)傳遞給該對象。然后,該調(diào)用的結果用于從返回mock_asy_method():


>>> from unittest import mock

>>> class ExampleClass:

...     async def asy_method(self, param):

...         return await some_coroutine(self, param)

...

>>> example_instance = ExampleClass()

>>> with mock.patch('__main__.ExampleClass.asy_method', autospec=True) as mock_asy_method:

...     configure_coroutine_mock(mock_asy_method)

...     print(example_instance.asy_method('foo'))  # call to patched class coroutine

...     print(mock_asy_method.mock_calls)          # calls are recorded

...

<AsyncMock name='asy_method()' id='4563887496'>

<coroutine object AsyncMock.__call__ at 0x1100780f8>

[call(<__main__.ExampleClass object at 0x10ffac1d0>, 'foo')]

如您所見,self參數(shù)和參數(shù)記錄在調(diào)用中,因為這mock_asy_method是一種適當?shù)暮瘮?shù)。


當然,只有在AsyncMock()實際等待返回的呼叫結果時,我們才會看到該呼叫也被記錄:


>>> with mock.patch('__main__.ExampleClass.asy_method', autospec=True) as mock_asy_method:

...     configure_coroutine_mock(mock_asy_method)

...     loop = asyncio.get_event_loop()

...     coro = example_instance.asy_method('foo')

...     loop.run_until_complete(coro)

...     print(mock_asy_method.mock_calls)

...     

<AsyncMock name='asy_method()' id='4564408920'>

<AsyncMock name='asy_method()()' id='4564999360'>    

[call(<__main__.ExampleClass object at 0x10ffac1d0>, 'foo'),

 call()(<__main__.ExampleClass object at 0x10ffac1d0>, 'foo')]


查看完整回答
反對 回復 2021-04-13
  • 1 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號