IronRuby:元编程特性【method_missing】的使用

  在OpenExpressApp中写的自动化测试用例片段如下,之所以能这么易读,是因为可以使用Ruby的method_missing来进行方法调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
打开模块 "部门管理"
# 1 新增部门, 编码:Test  名称:自动化测试
添加
输入 "编码","Test"   #也可以用一般语句对象.动作(参数): 属性编辑框("编码").输入("Test")
输入 "名称","自动化测试"
 
# 2 选择系统管理员再加任意几个岗位后
按钮("选择岗位").弹出窗口("选择岗位管理")
列表.选择行("一审人员")
按住Ctrl
列表.选择行(0)
列表.选择行(1)
释放Ctrl
关闭窗口(:确认)

本篇不具体介绍测试框架的编写,而是想给大家介绍一下method_missing的使用。

Ruby方法调用过程

  当你发送消息到Ruby对象时,Ruby查询与消息同名的方法来调用。Ruby进行方法调用主要有两种方式,obj.method_name 和 obj.send(:method_name),它进行方法调用过程如下:

  1. 查询当前对象的实例方法
  2. 该类引入的每个模块(后引入的先查找)
  3. 该类的父类以及父类引入的模块
  4. 直到Object类
  5. 通过以上路径查找方法后,如果还找不到该方法,则调用method_missing

method_missing    

  method_missing是Ruby的一个内核方法,它是Ruby元编程的一个大特性,这种功能在以往静态语言中是没有的,使用它可以非常容易的创建自己的DSL。从上面的方法调用路径可以看出来,method_missing是方法调用的最后一道防线,我们可以在方法查询路径里的任何位置覆盖method_missing来告诉Ruby当找不到方法时应该干什么。

  一般我们可以使用它来作为方法工厂或分配器,以下是我在做测试框架时的一个使用场景。

  框架中有一个类TestObject,它是所有测试控件的基类,它内部有一个Net下的UITestControl的引用test_controltest_control是实际的测试控件,里面有方法和可验证的属性可以调用。如果在以往静态语言中,你如果想通过TestObject方法调用test_control方法时,则需要通过适配器实现接口等方式来实现,而在Ruby下我们不需要了,使用method_missing可以轻易的在TestObject调用test_control的方法,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
require "inc.rb"
require "System.Drawing"
 
include Microsoft::VisualStudio::TestTools::UITest::Extension
 
class TestObject
 
  attr_accessor :test_control
  attr_accessor :name
 
  def initialize(test_control)
    @test_control = test_control
  end
 
  def method_missing(name, *args, &block)
    if @test_control.respond_to?(name)
      return @test_control.send(name, *args, &block)
    else
      raise "没有定义方法:" + name.to_s
    end
  end
   
  ......
end

 

 

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

posted on   周 金根  阅读(2588)  评论(0编辑  收藏  举报

编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)

导航

点击右上角即可分享
微信分享提示