(标题是:“如何为用 Python 编写的 DBUS 服务编写单元测试?”)
我已经开始使用 dbus-python 编写 DBUS 服务,但是我在为它编写测试用例时遇到了麻烦。
这是我正在尝试创建的测试示例。请注意,我在 setUp() 中放置了一个 GLib 事件循环,这就是问题所在:
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 工具从外部查询该服务,但我无法在启动它的测试中自动执行此操作。
我正在考虑在测试中进行某种进程分叉来处理这个问题,但我希望有人可能有一个更简洁的解决方案,或者至少是我编写这样一个测试的一个好的起点。