Как написать модульные тесты для функции, использующей dbus для получения информации из Spotify? - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть эта функция

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

Это берет информацию из spotify, используя dbus. Как мне написать юнит-тесты для него?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Наиболее распространенный подход к тестированию такого типа клиента службы D-Bus - это запуск его с поддельной сессионной шиной D-Bus, в которой работает фиктивная реализация службы Spotify (управляемая вашим тестовым кодом).

Вы можете использовать GTestDBus для создания фиктивной шины сеанса, а затем использовать обычные API-интерфейсы GDBus для предоставления объекта D-Bus.Создайте Gio.DBusConnection, связанный с адресом, возвращаемым g_test_dbus_get_bus_address(), затем предоставьте объект на нем по пути объекта D-Bus /org/mpris/MediaPlayer2, реализуя по крайней мере свойства org.freedesktop.DBus.Properties и возвращая ложные данныедля свойств, которые запрашивает ваш тестируемый код.

Тестируемый код должен использовать фиктивную сессионную шину при запуске под тестовым набором, потому что GTestDBus переопределяет переменную среды DBUS_SESSION_BUS_ADDRESS, которую GIOиспользует (по умолчанию) поиск адреса реальной шины сеанса.

0 голосов
/ 18 ноября 2018

Непосредственно написание модульных тестов для чего-то, что зависит от сети, не является хорошей идеей и также не гарантирует, что ваши тесты будут работать одинаково все время.

Но вы можете обойти это, добавив абстрактное вмешательство.Этот интерфейс может быть реализован вашим текущим подходом, который используется в вашем коде, и вы можете реализовать заглушку, которую вы используете в своих тестах.Это возвращает все, что вам нравится.

...