Como escrever um teste funcional para um serviço DBUS escrito em Python?

(O título era: "Como escrever um teste de unidade para um serviço DBUS escrito em Python?")

Comecei a escrever um serviço DBUS usando o dbus-python, mas estou tendo problemas para escrever um caso de teste.

Aqui está um exemplo do teste que estou tentando criar. Observe que eu coloquei um loop de evento GLib no setUp (), é aqui que o problema ocorre:

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()

Meu problema é que a implementação do DBUS exige que você inicie um loop de eventos para que ele possa começar a despachar eventos. A abordagem comum é usar o gobject.MainLoop (). Start () (embora eu não seja casado com essa abordagem, se alguém tiver uma sugestão melhor). Se você não iniciar um loop de eventos, o serviço ainda será bloqueado e você também não poderá consultá-lo.

Se eu iniciar meu serviço no teste, o loop de eventos impedirá a conclusão do teste. Sei que o serviço está funcionando porque posso consultá-lo externamente usando a ferramenta qdbus, mas não consigo automatizar isso dentro do teste que o inicia.

Estou pensando em fazer algum tipo de processo bifurcado dentro do teste para lidar com isso, mas esperava que alguém tivesse uma solução mais limpa ou, pelo menos, um bom ponto de partida para como escrever um teste como esse.

questionAnswers(6)

yourAnswerToTheQuestion