Он скрывает за вашими глазами некрасивую логику подпроцесса, поэтому вам не нужно беспокоиться об этом в своих тестах.

ание было: «Как написать модульный тест для службы 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 требует, чтобы вы запустили цикл обработки событий, чтобы он мог начать диспетчеризацию событий. Обычный подход заключается в использовании gobject.MainLoop (). Start () GLib (хотя я не женат на этом подходе, если у кого-то есть лучшее предложение). Если вы не запускаете цикл обработки событий, сервис все еще блокируется, и вы также не можете запросить его.

Если я запускаю свою службу в тесте, цикл обработки событий блокирует завершение теста. Я знаю, что служба работает, потому что я могу запросить службу извне, используя инструмент qdbus, но я не могу автоматизировать это в тесте, который ее запускает.

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

Ответы на вопрос(6)

Ваш ответ на вопрос