yml文件数据的简洁表达方法(Hashes to OpenStruct)

通过ruby编写测试脚本的时候,我还是喜欢采用yml来管理测试数据,就像以前的文章(Selenium WebDriver + Grid2 + RSpec之旅(五))提到的一样,但是在引用yml中的数据的时候采用

name = @data["data"]["logindata"]["wrong"]["username"]的方法显得非常臃肿,不方便阅读。

下面就通过定义一个函数来简化一下数据的引用

 1 def hashes2ostruct(object)
 2     return case object
 3     when Hash
 4         object = object.clone
 5         object.each do |key,value|
 6             object[key] = hashes2ostruct(value)
 7         end
 8         OpenStruct.new(object)
 9     when Array
10         object = object.clone
11         object.map! {|i| hashes2ostruct(i) }
12     else
13         object
14     end
15 end

然后在加载yml文件的时候就通过这个函数来装饰一下,再次引用变量的时候就显得轻便多了

 1 #encoding:utf-8
 2 require 'selenium-webdriver'
 3 require 'rspec'
 4 require 'yaml'
 5 require 'ostruct'
 6 
 7 require File.dirname(__FILE__)+'/../../public/public'
 8 require File.dirname(__FILE__)+'/../tool/login_dialog'
 9 require File.dirname(__FILE__)+'/../action/login_page'
10 
11 def hashes2ostruct(object)
12     return case object
13     when Hash
14         object = object.clone
15         object.each do |key,value|
16             object[key] = hashes2ostruct(value)
17         end
18         OpenStruct.new(object)
19     when Array
20         object = object.clone
21         object.map! {|i| hashes2ostruct(i) }
22     else
23         object
24     end
25 end
26 
27 describe 'cnblogs main login page' do
28     include Login_Dialog
29     
30     before (:all) do
31         @data = hashes2ostruct(YAML.load (File.open(File.dirname(__FILE__)+'/../config/login_data.yml')))
32     end
33    #此处省略相对多余代码
34    
35     context 'input the wrong passwd' do
36         it 'login failed,and return "用户名或密码错误"' do
37             name = @data.data.logindata.wrong.username
38         end
39     end
40 end

这样就清爽了吧,就像憋了好久的大便,一下子释放出来的感觉!(哈哈! 这个比喻有点太伤大雅了),希望对大家有用。
详情请访问http://www.dribin.org/dave/blog/archives/2006/11/17/hashes_to_ostruct/

原文地址:https://www.cnblogs.com/ouguangqian/p/Hashes_to_OpenStruct.html