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)