Итак, с помощью справки Фрика я понял, что хочу высмеять bleak.discover
, и вот как я это сделал:
Я нашел решение, используя этот ответ Ивана.
Вот мой тест:
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"
А вот и результат теста:
tests/test_ble.py::test_list 'T-000001'
'T-000002'
'T-000003'
PASSED
=== 1 passed in 0.09 seconds ===
Редактировать: предложение для элегантного кода:
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])
....