引用链接:http://reverocean.iteye.com/blog/1489957

1. describe和context
describe和context方法用来组织相关的行为example。

使用一个字符串作为他们的参数,以及使用一个block来定义其上下文的范围。

写model的spec或者其他的unit test时,可以传一个Ruby类作为describe的第一个参数。Doing so also creates an implicit subject for the examples.

describe Timesheet do

……

end

describe可以嵌套

一般使用:

describe Timesheet do

describe “#test” do

…..

end

end

这样的方式(注意第一个describe的参数是一个类,第二个describe参数是以#开始)这个表示测试Timesheet类下面的test方法)

2. let(:name) {expression}

let方法简单的使用后面的block创建memoized attributes.换句话说就是为后面的测试准备数据,跟before里的代码一样的,但是比before里的代码效果更好。

memozied的意思是let后面关联的block只执行一次,然后会缓存该变量,提高执行效率。

Lazy,有需要才会运算,并且是Memoized

相较于before(:each)增加执行速度

不需要用instance variable放before

增加可读性

let!则是非lazy

3. before和after

和setup、teardown方法类似

Before and after code can be inserted in any describe or context
blocks, and by default the execute for each it block that shares their
scope.

4. it

it方法使用一个描述和block。一个it就是一个测试,最好一个it一个期望

As mentioned, the idea is to complete the thought that was started in the describe method, so that it foms a complete sentence.

5. specify

specify是it方法的别名,但是他可以使用不同的结构来增加可读性。

describe BlogPost do

set(:blog_post) {blog_post = BlogPost.new}

specify {blog_post.should_not be_published}

end

生成的RSpecDoc如下:

BlogPost

- should not be published

6. expect

expect 用来改变一个值或者抛出一个异常。后面接change来表示要达到的值,使用raise_error(异常类)来表示会抛出一个异常。

expect {

BlogPost.create :title => “Hello”

}.to change {BlogPost.count}.by(1)

希望在expect块里做完之后,BlogPost.count的值要改为1

改变值的例子

describe Order do

  let(:order) {order = Order.create}

  describe "#ship!” do

    context “with paid” do

      it "should update status to shipping" do

        expect {

          order.ship!

          }.to change { order.status }.from(“new”).to(“ship”)

       end

    end

end

这里改变值使用的from和to,这样就会在执行expect块之前检查order.status的值是不是new,并且会在执行之后检查是不是”ship”值

抛出异常的例子

describe Order do

  let(:order) {order = Order.create}

  describe "#ship!” do

    context “with paid” do

      it "should raise NotPaidError" do

        expect {

          order.paid? = flase

          order.ship!

          }.to raise_error(NotPaidError)

       end

    end

end

这里表示执行完except块之后会抛出一个NotPaidError异常。

7. pending

可以使用pending来列出打算要写的测试

使用it函数不传block给他也是pending的意思,也可以在block离调用pending

可以在before里写pending

8. should和should_not

Rspec mixes them into the base Ruby Object class at runtime so that
they are available on all objects.They expect to receive Matcher
objects, generated using Rspec expectation syntax

receiver.should be_true

receiver.should be_false

receiver.should be_nil

检查型别、方法

receiver.should be_a_kind_of(Array)

receiver.should be_an_instance_of(Array)

receiver.should responsed_to(:foo)

检查Array、Hash

receiver.should have_key(:foo)

receiver.should include(4)

receiver.should have(3).items

任何be_开头

receiver.should be_empty

receiver.should be_blank

receiver.should be_admin

should == 是万能的

Rspec的Matcher很多,也可以自己写

9. Implicit Subject和Explicit Subject

使用subject可省略receiver

10. its

its可以省略receiver的方法调用

describe Order do

subject { Order.new}

its(:status) {should == “New”}

end

Rspec基本语法的更多相关文章

  1. 【转】iOS开发工具系列(按功能分)

    http://www.cocoachina.com/newbie/basic/2014/0417/8187.html 这是我们多篇iOS开发工具系列篇中的一篇,此前的文章比如:那些不能错过的Xcode ...

  2. iOS 开发常用的一些工具

    http://www.itjhwd.com/ios-tool/ 通用工具 HomeBrew:OS X上非常出色的包管理工具. 源码控制 Git:分布式版本控制系统和源码管理系统,其优点是:快和简单易用 ...

  3. 32款iOS开发插件和工具介绍[效率]

    插件和工具介绍内容均收集于网络,太多了就不一一注明了,在此谢过!   1.Charles 为了调试与server端的网络通讯协议.经常须要截取网络封包来分析. Charles通过将自己设置成系统的网络 ...

  4. Selenium WebDriver + Grid2 + RSpec之旅(一)----准备篇

    Selenium WebDriver + Grid2 + RSpec之旅(一)             ----准备篇 前言 在Web 2.0 应用中,在浏览器种类盛行的时代,我们在测试过程中不仅要模 ...

  5. Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章

    总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...

  6. Ruby之Rspec的报错解决

    #enconding:utf-8 require 'selenium-webdriver' require 'rspec' describe "baidu main page" d ...

  7. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  8. Swift与C#的基础语法比较

    背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...

  9. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

随机推荐

  1. Linux 文件名颜色

    在Linux中,文件的颜色都是有含义的.其中, 蓝色表示目录 绿色表示可执行文件 红色表示压缩文件 浅蓝色表示链接文件 灰色表示其它文件 红色闪烁表示链接的文件有问题了 黄色是设备文件,包括block ...

  2. HTML DOM setTimeout() 方法

    转自:http://www.w3school.com.cn/jsref/met_win_settimeout.asp 1.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. &l ...

  3. Java探索之旅(15)——包装类和字符类

    1.包装类 ❶出于对性能的考虑,并不把基本数据类型作为对象使用,因为适用对象需要额外的系统花销.但是某些Java方法,需要对象作为参数,例如数组线性表ArrayList.add(Object).Jav ...

  4. Unity实现支持泛型的事件管理以减少使用object作为参数带来的频繁装拆箱

    如果不用C#自身的event关键字而是要自己实现一个可统一管理游戏中各种消息事件通知管理的系统模块EventManger时,通常都是把事件delegate的参数定义为object类型以适应所有的数据类 ...

  5. docker里安装ubuntu

    使用 Ubuntu 官方镜像 Ubuntu 相关的镜像有很多,这里使用 -s 10 参数,只搜索那些被收藏 10 次以上的镜像 $ docker search -s 10 ubuntu NAME DE ...

  6. 阶段2-新手上路\项目-移动物体监控系统\Sprint4-嵌入式web服务器开发\第3课-CGI程序开发

    实现CGI程序显示一幅图片最核心的功能 把上一节课编写好的led.c程序拷贝过来,并重新命名为image.c 把led的某些部分删除,后如下 那么如何显示一幅图片呢,百度(搜索在html里面去插入图片 ...

  7. java多态和强制类型转换

    子类可以赋值给超类,称之为向上转型,这个是自动的. 超类不可以赋值给子类,这个是向下转型,需要我们手动实现. 赋值给超类的子类引用在运行期间将表现出不同的特性,这就是多态. 小类型    可转换为   ...

  8. 【Qt官方例程学习笔记】Raster Window Example(画笔的平移/旋转/缩放应用)

    这个例子显示了如何使用QPainter渲染一个简单的QWindow. 值得学习的内容 <QtGui>头文件 #include <QtGui>就可以使用Qt GUI模块中的所有类 ...

  9. Mysql索引优化1

    Btree索引和哈希索引(索引是一种数据结构,提高查询,排序,分组速度) Btree索引的数据结构是平衡二叉树,时间复杂度为lgN 哈希索引的数据结构是一个Hash函数,时间复杂度为O(1),数据输入 ...

  10. Java中Class Type 类类型是怎么回事?

    Java中三种方式可以用来表示Class Type(类的实例对象), 第一种,通过隐藏的静态成员变量class来表示:第二种,通过调用该类的对象的getClass方法:第三种,通过Class.forN ...