Cucumber入门之_World

简介: 1. World:   World可以看做是Cucumber在运行每个场景之前所要创建的对象的实例,它不仅使得每一个Step Definition可以调用该实例的方法,而且使得为该项目定义的Ruby类是也可以调用该实例的方法。

1. World

  World可以看做是Cucumber在运行每个场景之前所要创建的对象的实例,它不仅使得每一个Step Definition可以调用该实例的方法,而且使得为该项目定义的Ruby类是也可以调用该实例的方法。World在Cucumber中被定义为方法,接受可变参数mudules,以及一个proc:  

1   def World(*world_modules, &proc)2 
2 RbDsl.build_rb_world_factory(world_modules, proc)
3  end



下面看一个我自己写的小示例:

   目录结构如下:

 

env.rb:该文件通常用于准备环境变量, 这里我加载了三个文件。

1 require 'rubygems'
2 require 'watir-webdriver'
3 require 'rspec'

 

 world.rb

 1 module MyModule
2
3 def self.foo(name)
4 puts "MyModule_FOO: #{name} "
5 end
6
7 def boo(key)
8 puts "MyModule_BOO: #{key}!"
9 end
10
11 end
12
13 World(MyModule)

   在该文件中定义了一个module,在该module中定义了两个方法:一个实例方法boo, 一个类方法foo。最后把定义的这个模块传递给World. 这样以来我们在运行feature的时候,在其它地方(step_definitions或自定义ruby类文件)就可以调用这个module里面的方法了。

 

test.feature 

1 Feature:Test
2 In order to test how to use world
3 as a learner
4 I want to practice to use world
5
6 Scenario: practice to use hooks
7 Given try to use the cucumber keyword

  在这个feature文件中我定义的比较简单,只定义了一个scenario,且该scenario中只有一个步骤Given。因为这个小例子是为了说明World的用法,所以这里不对feature做过多讨论。

 

test.rb

1 Given /^try to use the cucumber keyword$/ do
2 @page = Home.new
3 @page.visit!
4 MyModule.foo("*step_definitions*")
5 end

  在这个step_definitions文件中,是对feature文件中的具体操作实现。因为我们都知道feature文件中只是做了一些描述,具体的执行是放到step_ definitions下面的文件里面的。在这个文件中我new了一个Home文件(看下面Home文件的定义),并且调用了在Home文件中定义的visit!方法。最后一行,我直接调用了在world.rb文件中定义的module的方法foo(因为foo是一个类方法,所以可以直接调用。而boo方法是实例方法,调用前必须实例化一个对象)。

 

Home.rb

1 class Home
2
3 def visit!
4 MyModule.foo("*Home_page_module*")
5 end
6
7 end

  这个文件是我为该项目自己定义的一个ruby类文件,里面定义了一个visit!方法,该方法也调用了world.rb文件中的类方法foo。

  根据文章一开头提到的,World不仅使得Step Definition可以调用该实例的方法,而且使得为该项目定义的Ruby类也可以调用该实例的方法。如此那么程序正常应该会分别输出这两句话。

 

结果:

1 C:\Ruby192\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) C:\Ruby192\bin/cucumber D:/cucumber/mycucumber/features/test.feature --format Teamcity::Cucumber::Formatter --expand --color -r features
2 Testing started at 上午10:37 ...
3 MyModule_FOO: *Home_page_module*
4 MyModule_FOO: *step_definitions*
5 1 scenario (1 passed)
6 1 step (1 passed)
7 0m0.000s

  结果中3,4行和我们预期的一致。
  

 

 

目录
相关文章
|
网络协议 Java 物联网
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图
2047 3
|
运维 Kubernetes 算法
资源画像,看得见的容器资源优化助手
日前,ACK 控制台在此基础上正式发布了资源画像功能,为用户提供了可视化的交互页面,便于管理员快速分析应用资源规格的合理性,并进行资源规格配置的变更。该功能目前已经正式开放公测,ACK 用户可以直接申请白名单试用。
资源画像,看得见的容器资源优化助手
|
缓存 前端开发 应用服务中间件
Nginx开启Gzip压缩功能(附详细解释)+测试是否开启了压缩
Nginx实现资源压缩的原理是通过ngx_http_gzip_module模块拦截请求,并对需要做gzip的类型做gzip,ngx_http_gzip_module是Nginx默认集成的,不需要重新编译,直接开启即可。
3622 1
Nginx开启Gzip压缩功能(附详细解释)+测试是否开启了压缩
|
API Android开发
实现一个带有header和footer功能的RecyclerView
这是我之前一篇老文章了,重新整理了一下在掘金发一下,大家可以参考参考。 RecyclerView是Android 5.0版本引入的一个新的组件,目的是在一些场景中取代之前ListView和GridView,实现性能更优的解决方案。同时RecyclerView的灵活性让它可胜任更多的场景。关于RecyclerView的使用有太多的文章了,大家可以自行搜索。 我们知道RecyclerView很灵活,灵活到很多功能需要我们自己实现,比如ListView和GridView中最常用的Item点击事件。所以在使用了几次后,我准备自己封装一个WrapRecyclerView,实现一些非常常用的功能。
303 0
|
机器学习/深度学习 移动开发 Kubernetes
产教结合、硬软一体,阿里云教育一体机发布
阿里云教育一体机,基于云原生开发服务(阿里云容器服务Kubernetes)和移动开发服务(EMAS),为高校学生量身定制了一系列课程及实验,将前沿科技的理论和最佳实践引入高校,以软件硬件于一体的交付方式为教育行业提供解决方案。产品旨在缩小高校在人才培养侧和市场需求侧在结构、质量、水平存在的差异。
742 0
产教结合、硬软一体,阿里云教育一体机发布
|
8天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!