(Название было: "Как написать unit test для службы DBUS, написанной на Python?" )
Я начал писать службу DBUS с помощью dbus-python, но мне трудно написать тестовый пример.
Вот пример теста, который я пытаюсь создать. Обратите внимание, что я поставил цикл событий GLib в setUp(), в этом проблема:
import unittest
import gobject
import dbus
import dbus.service
import dbus.glib
class MyDBUSService(dbus.service.Object):
def __init__(self):
bus_name = dbus.service.BusName('test.helloservice', bus = dbus.SessionBus())
dbus.service.Object.__init__(self, bus_name, '/test/helloservice')
@dbus.service.method('test.helloservice')
def hello(self):
return "Hello World!"
class BaseTestCase(unittest.TestCase):
def setUp(self):
myservice = MyDBUSService()
loop = gobject.MainLoop()
loop.run()
# === Test blocks here ===
def testHelloService(self):
bus = dbus.SessionBus()
helloservice = bus.get_object('test.helloservice', '/test/helloservice')
hello = helloservice.get_dbus_method('hello', 'test.helloservice')
assert hello() == "Hello World!"
if __name__ == '__main__':
unittest.main()
Моя проблема заключается в том, что для реализации DBUS вам необходимо запустить цикл событий, чтобы он мог запускать диспетчерские события. Общий подход заключается в использовании GLib gobject.MainLoop(). Start() (хотя я не женат на этом подходе, если у кого-то есть лучшее предложение). Если вы не запускаете цикл событий, служба по-прежнему блокируется, и вы также не можете запросить его.
Если я запустил свою службу в тесте, цикл события блокирует выполнение теста. Я знаю, что служба работает, потому что я могу запросить внешнюю службу с помощью qdbus-инструмента, но я не могу автоматизировать это внутри теста, который запускает его.
Я рассматриваю возможность выполнения какого-то процесса, выполняющегося внутри теста, чтобы справиться с этим, но я надеялся, что у кого-то может быть более аккуратное решение или, по крайней мере, хорошее начало для того, как я напишу такой тест.