"""pytest 根配置:保证无论从哪个工作目录启动 pytest,均可导入 utils/ 下的包; 并提供 fake_mavsdk fixture,使网关 mock 单测与真实 libcmavsdk.so 脱钩。""" import sys import types from pathlib import Path import pytest _UTILS_DIR = Path(__file__).resolve().parent if str(_UTILS_DIR) not in sys.path: sys.path.insert(0, str(_UTILS_DIR)) @pytest.fixture def fake_mavsdk(monkeypatch): """打桩 mavsdk.offboard 设定点类型(VelocityBodyYawspeed / VelocityNedYaw)。 MavsdkCommandGateway 构造设定点时惰性 `from mavsdk import offboard`——即便 offboard 传输层是 mock,也会去加载真实原生库。libcmavsdk.so 损坏或未装的 机器(如 libstdc++ 缺新符号的树莓派)上,纯 mock 单测会因此误失败。 用法与 fake_serial 打桩 pyserial 同理:sys.modules 注入轻量桩模块。 """ offboard_mod = types.ModuleType("mavsdk.offboard") class VelocityBodyYawspeed: def __init__(self, forward_m_s, right_m_s, down_m_s, yawspeed_deg_s): self.forward_m_s = forward_m_s self.right_m_s = right_m_s self.down_m_s = down_m_s self.yawspeed_deg_s = yawspeed_deg_s class VelocityNedYaw: def __init__(self, north_m_s, east_m_s, down_m_s, yaw_deg): self.north_m_s = north_m_s self.east_m_s = east_m_s self.down_m_s = down_m_s self.yaw_deg = yaw_deg offboard_mod.VelocityBodyYawspeed = VelocityBodyYawspeed offboard_mod.VelocityNedYaw = VelocityNedYaw mavsdk_mod = types.ModuleType("mavsdk") mavsdk_mod.offboard = offboard_mod monkeypatch.setitem(sys.modules, "mavsdk", mavsdk_mod) monkeypatch.setitem(sys.modules, "mavsdk.offboard", offboard_mod) return offboard_mod