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),它进行方法调用过程如下:
- 查询当前对象的实例方法
- 该类引入的每个模块(后引入的先查找)
- 该类的父类以及父类引入的模块
- 直到Object类
- 通过以上路径查找方法后,如果还找不到该方法,则调用method_missing
method_missing
method_missing是Ruby的一个内核方法,它是Ruby元编程的一个大特性,这种功能在以往静态语言中是没有的,使用它可以非常容易的创建自己的DSL。从上面的方法调用路径可以看出来,method_missing是方法调用的最后一道防线,我们可以在方法查询路径里的任何位置覆盖method_missing来告诉Ruby当找不到方法时应该干什么。
一般我们可以使用它来作为方法工厂或分配器,以下是我在做测试框架时的一个使用场景。
框架中有一个类TestObject,它是所有测试控件的基类,它内部有一个Net下的UITestControl的引用test_control,test_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/ ]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架