如何使用dbus编写功能的单元测试以从Spotify获取信息?

时间:2018-11-18 15:37:49

标签: python linux unit-testing dbus

我有这个功能

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获取信息。我该如何编写单元测试?

2 个答案:

答案 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默认使用该变量来查找其地址。真正的会话总线。