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

打开模块 "部门管理"
# 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_control,test_control是实际的测试控件,里面有方法和可验证的属性可以调用。如果在以往静态语言中,你如果想通过TestObject方法调用test_control方法时,则需要通过适配器实现接口等方式来实现,而在Ruby下我们不需要了,使用method_missing可以轻易的在TestObject调用test_control的方法,代码如下所示:

require "inc.rb"
require "System.Drawing"include Microsoft::VisualStudio::TestTools::UITest::Extensionclass TestObjectattr_accessor :test_controlattr_accessor :namedef initialize(test_control)@test_control = test_controlenddef method_missing(name, *args, &block)if @test_control.respond_to?(name)return @test_control.send(name, *args, &block)elseraise "没有定义方法:" + name.to_sendend......
end

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

IronRuby:元编程特性【method_missing】的使用相关推荐

  1. python加上子类的特性_Python里的元编程:控制产生的实例对象的特性以及实例

    很多人不理解"元编程"是个什么东西,关于它也没有一个十分准确的定义.这篇文章要说的是Python里的元编程,实际上也不一定就真的符合"元编程"的定义.只不过我无 ...

  2. java元编程_一文读懂元编程

    元编程(Metaprogramming)是编写.操纵程序的程序,简而言之即为用代码生成代码.元编程是一种编程范式,在传统的编程范式中,程序运行是动态的,但程序本身是静态的.在元编程中,两者都是动态的[ ...

  3. 什么是元编程(meta-promgramming)?

    可以扩展程序自身,这样的能力,为元编程. 比如Ruby,使用元编程可以扩展出领域专用语言DSL, 比如RSpec.puppet.chef等.相对于新创造的领域专用语言DSL来说, Ruby语言就成为其 ...

  4. Ruby元编程技术(Ruby Metaprogramming techniques)

    我最近考虑了很多元编程(Metaprogramming)的问题,并希望看到更多这方面技术的例子和讲解.无论好坏,元编程已经进入Ruby社区,并成为完成各种任务和简化代码的标准方式.既然找不到这类资源, ...

  5. JavaScript—ES6 元编程(5)

    几年前 ES6 刚出来的时候接触过 元编程(Metaprogramming)的概念,不过当时还没有深究.在应用和学习中不断接触到这概念,比如 mobx 5 中就用到了 Proxy 重写了 Observ ...

  6. python元编程详解

    什么是元编程 软件开发中很重要的一条原则就是"不要重复自己的工作(Don't repeat youself)",也就是说当我们需要复制粘贴代码时候,通常都需要寻找一个更加优雅的解决 ...

  7. 前端技巧-JS元编程ES6 symbol公开符号

    元编程就是指以操作目标为程序本身的行为特性的编程,而在ES6中增加了类型symbol,除了自定义的符号之外,还预定义了其他的一些内置符号,可以被称为内置符号.下面就来给大家介绍一下这些内置符号. 1. ...

  8. C++模板元编程 入门简介

    最近一直在看STL和Boost,源码里边好多涉及到模板元编程技术,简单了解一下,备忘(Boost Python中的涉及模板元的部分重点关注一下). 范例引入 // 主模板 template<in ...

  9. JavaScript 元编程

    大家好,我是若川.今天给分享一篇来自freecodecamp的好文.我是freecodecamp杭州社区组织者之一,有一群小伙伴一起组织线下分享活动,不过2020年我们杭州社区几乎没有活跃,我也没有什 ...

最新文章

  1. Linux chmod命令详解
  2. java成员变量的初始化
  3. nginx日志中$request_time时间异常问题排查
  4. 大数据之-Hadoop3.x_MapReduce_MapJoin案例完成---大数据之hadoop3.x工作笔记0134
  5. bae php微信配置,使用BAE3.0搭建微信开发环境
  6. iView学习笔记(四):Form表单操作
  7. 学习项目管理PRINCE2有什么用??
  8. Mybatis之代码自动生成工具
  9. Fastdfs读取文件内容
  10. Linux平台开源浏览器
  11. python数据分析岗位做什么_Python数据分析--数据分析岗位最新招聘情况
  12. 玩冒险岛java卸载_冒险岛(经典版)卸载数据包方法
  13. 查看dmp文件oracle版本,Oracle的DMP文件修改版本号
  14. 正则表达式给查找到的内容加引号
  15. 七张图总结了我的2021年,心依然热,情依然真----感谢2021年的自己,感谢CSDN
  16. uni真机showToast不显示
  17. 笔记本UIOP几个键总是输入数字的问题
  18. python脚本分享:xml文件批量修改
  19. 如何取消windows xp开机时的登录界面
  20. 【日常记录】CTF审查清单(linux)

热门文章

  1. 超强NLP思维导图,知识点全面覆盖:从基础概念到最佳模型,萌新成长必备资源...
  2. 睡不着的时候,我会......
  3. Vue核心50讲 | 第四回:Vue 官方赠送的橙色装备,岂能不要
  4. volatile关键字(三)
  5. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(7.2) 模块管理,模块的添加、修改、删除...
  6. tomcat-users.xml 配置(转的)
  7. 关于self.用法的一些总结
  8. linux线程栈溢出与局部变量,Linux下和core说再见之:栈溢出
  9. 设计模式 — 行为型模式 — 状态模式
  10. 用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码