openSUSE:WebYaST 测试/D-Bus

跳转到:导航搜索

编写涉及 D-Bus 的测试

遵循 不要访问系统 约定,以下是如何在编写 WebYaST 测试时模拟 D-Bus 调用。

[ 参考:使用 Ruby 驾驭 D-Bus ]

D-Bus “术语” 简要回顾

你需要了解的术语:总线服务对象接口代理

从根本上说,D-Bus 以面向对象的方式提供“远程过程调用”。

一个服务拥有实现接口(一组函数)的对象

服务通过点符号表示法标识,例如“org.freedesktop.Hal”

接口也使用点符号表示法,例如“org.freedesktop.Hal.Device.Storage.Removable”

对象通过斜杠符号表示法标识,例如“/org/freedesktop/Hal/devices/storage_model_DVDRW_LH_20A1S”

服务可以在全局范围内(通过系统总线)或本地范围内(会话总线)可用

由于对象存在于 D-Bus 的“另一端”,你需要通过 D-Bus 将函数调用传输到远程对象。

代理对象极大地简化了这一点。代理是存在于“你的”D-Bus 侧的本地对象,假装是真实的对象。在内部,它通过 D-Bus 将所有函数调用发送到远程对象并接收结果。

模拟 D-Bus

大部分模拟细节都可以在DBusStubRuby 类中找到,它是 webyast-base-ws 包的一部分

你的 Ruby 测试用例应该有这行代码来导入 DBusStub 类

 require File.expand_path( File.join("test","dbus_stub"), RailsParent.parent )

现在创建一个 DBusStub 实例,使用

  dbus = DBusStub.new :system, "dbus.service.spec"

第一个参数可以是:system,用于 D-Bus 系统总线上的服务,或者:session,用于会话总线

接下来我们创建一个代理。代理是远程(D-Bus)对象的本地实例,假装是真实的对象。

  proxy = dbus.proxy "/path/to/service"

服务函数通过接口提供,通过以下方式创建

  interface = dbus.interface proxy, "dbus.service.spec.iface"

由于代理和接口的创建通常一起进行,因此可以将上述两个调用组合成一个,如下所示

  proxy,interface = dbus.proxy "/path/to/service", "dbus.service.spec.iface"

现在你可以使用正常的 Mocha 调用来模拟接口函数,例如:

  interface.stubs(:Function).returns(true)