<p>因此,对于Freek的<a href="https://stackoverflow.com/questions/56643926/how-to-perform-unit-tests-of-asynchronous-functions#comment99859255_56644096">help</a>,我知道我想嘲笑<code>bleak.discover</code>,下面是我如何做到的:</p>
<p>我找到了一个使用Ivan的<a href="https://stackoverflow.com/a/50031903/6813732">this anwser</a>的解决方案。在</p>
<p>这是我的测试:</p>
<pre class="lang-py prettyprint-override"><code>import os, asyncio
from unittest.mock import Mock
from app.functions.ble import ble
class BLE:
def __init__(self, name):
self.name = name
# code of Ivan, thank you Ivan!
def async_return(result):
f = asyncio.Future()
f.set_result(result)
return f
def test_list(monkeypatch):
mock_discover = Mock(return_value=async_return([BLE("T-000001"), BLE("T-000002"), BLE("T-000003")]))
monkeypatch.setattr('bleak.discover', mock_discover)
list_BLE = ble.list("Linux")
mock_discover.assert_called_once()
assert list_BLE[0] == 'success'
assert list_BLE[1][0] == "T-000001"
</code></pre>
<p>测试结果如下:</p>
^{pr2}$
<p>编辑:优雅代码建议:</p>
<pre><code>from unittest import TestCase
from unittest.mock import patch
import os, asyncio
from app.functions.ble import ble
class DeviceDiscoveryTest(TestCase):
@staticmethod
def __async_return(result):
f = asyncio.Future()
f.set_result(result)
return f
@classmethod
def mocked_discover(cls):
return cls.__async_return([BLE("T-000001"), BLE("T-000002"), BLE("T-000003")])
@patch('bleak.discocver', new=DeviceDiscoveryTest.mocked_discover)
def test_discover_devices(self):
list_BLE = ble.list("Linux")
self.assertEquals('success', list_BLE[0])
....
</code></pre>