Day 16 Matcher 介绍 (上)

该文章同步发布於:我的部落格

今天进入介绍 Matcher 的第一天!

会介绍一些常用,也有可能不常用的东西~

首先我想先介绍一个超基本的用法 not_to,基本上就是把我们常用的 to 替代掉而已,至於功能是什麽,我想字面上应该是非常的清楚!

但我们还是用一个小小的范例来补充一下:

RSpec.describe "not_to" do
  it "will be pass" do
    expect(1+1).not_to eq(3)
  end
end

就非常简单的反义,实用点数五颗星!

Comparison matchers

比较用的 Mathcer 这也是使用度非常高的一个,使用的方法也非常简单。

就是大於、小於、这类很直觉的东西!

我们用可以用很多的范例来让看看,顺便练习我们之前提过 subject 的 一行流写法!

RSpec.describe "Comparison matchers" do
  describe 50 do
    it { is_expected.to be > 40 }
    it { is_expected.to be >= 50 }
    it { is_expected.to be < 500 }
    it { is_expected.to be <= 50 }
    it { is_expected.not_to be > 55 }
  end
end

他可以接受所有 Ruby 的比较符号,那这个范例中,也有用到 subject 的概念,因为我们 describe 後面接的不是字串,是整数!

所以他会在 block 里面生成:

let(:subject) { 50 }

而下面的 一行流 写法也是 RSpec 提供给我们的语法!

Predicate matchers

predicate method 在 Ruby 的世界中,都泛指回传 boolean 的方法!

而在 Ruby 的惯例中,predicate method 通常都会用 ? 做结尾。

我觉得这点真的很贴心,也很好识别!

用一些范例来让大家看看!

> p 0.zero?
> true
> p 15.odd?
> true
> p [].empty?
> true

我的破英文都看得很有感了,相信一般人看到也会觉得好贴心啊!!!

所以接下来要介绍的是在 RSpec 中的 predicate matcher,其实大同小异,但还是做点范例~

有些人会把 predicate method 写在 expect 里面,像这样:

RSpec.describe "predicate method" do
  it "use ruby method" do
    expect(16.even?).to eq(true)
  end
end

这样也没有什麽问题,但就是少了 RSpec 的浪漫,所以我们要用他帮我们准备好的方法来改写看看

RSpec.describe "predicate matchers" do
  it "use rspec matcher" do
    expect(16).to be_even
  end
end

这样要测试的效果其实和上面一样!

所有 Ruby 的 predicate method 都可以直接无痛的转移成 Rspec 的 matcher!

> odd? -> be_odd
> empty? -> be_empty
> zero? -> be_zero

就是把问号拔掉,前面用 be_ 串接上去,就能做到一样的效果!而且阅读起来又更 RSpec 一点~

甚至你也可以用更像英文的写法来写, be_a_ & be_an_ 都是可以的用法喔!看看范例:

RSpec.describe "read more naturally" do
  it "test a string" do
    expect("string").to be_an_instance_of(String)
  end
end

效果等同於:

"string".instance_of?(String)
# true

但要记得,写 Rails 时,若是自己定义的 predicate method 是 private 的话,就没办法使用喔!会造成 error

小结

今天先介绍了两种非常实用的 matcher,明天也会接着继续介绍!


<<:  [16] [烧瓶里的部落格] 06. 部落格的 Blueprint

>>:  IOS、Python自学心得30天 Day-27 IOS导入Firebase套件

Day 8:IAM role、Policy建立

上篇我们学习到了如何再AWS Console建立user跟Group,今天我们来继续看如何建立rol...

第十七天:该用 implementation 还是 compile?

在定义 Gradle Build Script 里的 dependencies 时,您是不是也曾跟笔...

Day2 HTML

每件事情的开头一定都有属於他自己的原因,想达成的目标、想解决的问题、後面的文章会绕着三大主轴在运转:...

在Windows 10中更改Windows应用商店下载的位置

大多数应用程序都可以安装在非系统磁碟机上。但是,某些应用程序无法安装或移至系统磁碟机以外的磁碟机。因...

Day 2 ( 入门 ) 简单烟火动画

简单烟火动画 教学原文参考:简单烟火动画 这篇文章会介绍如何使用「重复无限次」、「显示指示灯」和「暂...