我有这个功能
def get_info_linux():
import dbus
session_bus = dbus.SessionBus()
spotify_bus = session_bus.get_object("org.mpris.MediaPlayer2.spotify",
"/org/mpris/MediaPlayer2")
spotify_properties = dbus.Interface(spotify_bus,
"org.freedesktop.DBus.Properties")
metadata = spotify_properties.Get("org.mpris.MediaPlayer2.Player", "Metadata")
track = str(metadata['xesam:title'])
artist = str(metadata['xesam:artist'][0])
return artist, track
这使用dbus从Spotify获取信息。我该如何编写单元测试?
答案 0 :(得分:0)
直接编写对网络有依赖性的内容的单元测试不是一个好主意,并且也不能确保您的测试始终具有相同的行为。
但是您可以通过添加抽象干扰来避免这种情况。该接口可以通过代码中使用的当前方法来实现,并且可以实现在测试中使用的存根。这将返回您喜欢的任何内容。
答案 1 :(得分:0)
测试这种D-Bus服务客户端的最常见方法是在伪造的D-Bus会话总线上运行它,该总线上模拟了Spotify服务的模拟实现(由测试代码控制)。
您可以使用GTestDBus
创建模拟会话总线,然后使用常规的GDBus API在其上公开D-Bus对象。创建一个连接到g_test_dbus_get_bus_address()
返回的地址的Gio.DBusConnection
,然后在D-Bus对象路径/org/mpris/MediaPlayer2
上公开一个对象,至少实现org.freedesktop.DBus.Properties
属性,然后返回模拟待测代码查询的属性的数据。
在测试工具下运行时,被测代码应使用模拟会话总线,因为GTestDBus
会覆盖DBUS_SESSION_BUS_ADDRESS
环境变量,GIO默认使用该变量来查找其地址。真正的会话总线。