RSpec入门(一)

这篇博客是关于RSpec的入门知识的,因为最近工作需要,所以找到了一些适合新手的入门材料,为了学习和归纳,这里做个简单翻译,有需要的可以去看看原文,省略了一些不必要的东西,也加入了一些自己的看法。

参考地址:使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」

开始

RSpec很难吧,是不是特么的什么都不懂,关于这样的评论是经常能看到的。确实,因为RSpec独特的结构,以及有很多功能,[看起来很难]这样的情绪是很能理解的。

但是,不仅仅只是RSpec,不管什么样的框架也是一样的,习惯了之后,都能够很顺利的写的,实际上个人认为[RSpec是很方便的]。 (这是原作者这么认为的,我到现在也是经常一脸懵逼…)

这里总结的是,原作者认为最低限度的需要了解的RSpec的文章结构,已经经常被使用的功能做一个总结。

本文的文章结构和功能如下

  • describe / it / expect 的作用
  • describe的嵌套
  • context的使用方法
  • let / let!/ subject的使用方法
  • shared_examples的使用方法
  • shared_context的使用方法
  • pending 和 skip的使用区分

关于其他的当然还有后续,如果有需要请参考原文,比如说mock,CapybaraのDSL等等。

阅读适合的对象

  • RSpec读起来真的头痛的初心者
  • 已经使用过很多次了,但是RSpec还是不知道是啥的经验者
  • 有着Ruby关系的项目,需要写RSpec测试的人员,但是仍有困惑的从其他测试平台的经验者

Ruby和Rails的版本

  • RSpec 3.10
  • Ruby 2.1.3

这次的博文,没有用rails,纯Ruby的代码。

关于RSpec的安装环境和方法

这里原文当然也有粘贴方法,但是我这里就不详细讲了,需要的可以查询下其他资料。

第一步

理解describe/it/expect的作用

最简单的RSpec是这样的记述的:

1
2
3
4
5
describe '四则运算' do
it '1+1 是 2 的时候' do
expect(1+1).to eq 2
end
end

describe是test的分组的宣言,在这里‘是有关于四则运算的test’的声明。

it 是test中是以example为单位的作用。it do …end中,expecting(和预期一致的值比较)如果全部pass的话,那么这个example就是pass(通过了)。

1
expect(X).to eq Y

这样的记述,就是一个expecting,并且
expect(1+1).to eq 2这样的意义是[1+1的结果期待是2]的测试。

把should变成expect的理由

在RSpec的2.10以前,should是下面的方法的:

1
2
3
(1+2).should eq 3
#或者是
(1+2).should == 3

然后,现在不使用should,而是使用expect的理由是,should是黑魔法,如果使用的话会有发生问题的可能,如果有想看详细的理由的,请看:
参考地址:不用should的原因

复数的example

在describe中,可以写复数的example(it do …end):

1
2
3
4
5
6
7
8
descibe '四则运算' do
it '1+1要等于2' do
expect(1 + 1).to eq 2
end
it '10-1要等于9' do
expect(10 - 1).to eq 9
end
end

那么如果实现测试的话,会有一下的结果

1
2
3
4
5
2 examples, 0 failures, 2 passed
Finished in 0.002592 seconds
Process finished with exit code 0

复数的expecting

在一个example中,可以有很多的expecting:

1
2
3
4
5
6
7
8
describe '四則演算' do
it '全部都可以通过' do
expect(1 + 2).to eq 3
expect(10 - 1).to eq 9
expect(4 * 8).to eq 32
expect(40 / 5).to eq 8
end
end

但是,如果这么使用的话的,途中test失败的时候,那么之前的expect是通过了还是没有通过是不能够预想的(就是说,如果中间一个expect出错了,那么是前几个的错还是后几个的错事不知道的)。
所以,原则上[1个example上只有一个expect],这样的写的测试具有很好的保守性。

describe的嵌套

多少个describe都是可以写的,嵌套是可以的。
基本的作用就是[把test分组化],如下面的group可以这么写:

1
2
3
4
5
6
7
8
9
10
11
12
describe '四則演算' do
describe '加法' do
it '1 + 1 は 2 になること' do
expect(1 + 1).to eq 2
end
end
describe '减法' do
it '10 - 1 は 9 になること' do
expect(10 - 1).to eq 9
end
end
end

这样的话,能够让读代码的人很好的理解。

context和before会更加的便利

使用更有实践的例子来说明,让我们来看看context和before的使用方法

这是User类的声明,

当12岁及以下,是中文。
当age是13岁及以上,是英文。

1
2
3
4
5
6
7
8
9
10
11
12
13
class User
def initialize(name:, age:)
@name = name
@age = age
end
def greet
if @age <= 12
"我叫#{@name}。"
else
"My name is #{@name}。"
end
end
end

那么对应的RSpec就是:

1
2
3
4
5
6
7
8
9
10
11
12
describe User do
decribe '#greet' do
it '12岁及以下' do
user = User.new(name: '杰克', age:12)
expect(user.greet).to eq '我叫杰克'
end
it '13岁以上' do
user = User.new(name: 'Jack', age:13)
expect(user.greet).to eq 'My name is Jack'
end
end
end

在这里的时候,要注意describe可以接class,也可以接文字列:

1
2
describe User do
describe '#greet' do

describe中,instance method的一般的写法是’#methodname’

context的条件组

```

坚持原创技术分享,您的支持将鼓励我继续创作!