我正在使用Bleak来发现并连接到最近的蓝牙低能耗(BLE)设备,并且我正在编写单元测试(使用pytest)。在
我是Python测试的新手,我不知道如何处理这些补丁/mock,使其在async
函数上工作。在
我不知道我是应该使用实际的函数,还是对默认函数应用补丁,使测试在没有BLE加密狗的情况下可执行。在
下面是一个代码示例(对discover.py的改进):
def list(op_sys: str) -> list:
"""list BLE devices
Returns:
list: status & list or error message
"""
import asyncio, platform
from bleak import discover
async def run() -> list:
"""discover BLE devices
Returns:
list: status & list or error message
"""
BLElist = []
try:
devices = await discover()
for d in devices:
print("'%s'" % d.name) # list devices
BLElist.append(d.name)
return 'success', BLElist
except:
return 'error', 'You don\'t have any BLE dongle.'
# linux = 3.6, windows = 3.7, need a new loop to work
if op_sys == "Windows":
asyncio.set_event_loop(asyncio.new_event_loop())
loop = asyncio.get_event_loop()
return loop.run_until_complete(run())
我想知道是否应该重写该函数,将run()
部分移到外部,并对其进行模拟。在
因此,对于Freek的help,我知道我想嘲笑
bleak.discover
,下面是我如何做到的:我找到了一个使用Ivan的this anwser的解决方案。在
这是我的测试:
测试结果如下:
^{pr2}$编辑:优雅代码建议:
外部函数
list(op_sys) -> list
不是异步的,因为它调用了loop.run_until_complete
。在这样就可以像任何同步python函数一样进行单元测试。在
如果您想对内部函数
run() -> list
等异步函数进行单元测试,请看这里:https://pypi.org/project/asynctest/。在相关问题 更多 >
编程相关推荐