Website logo

Robert Chang

技術部落格

RSpec - 更多的 Matchers ( 上 )

首先想先介紹一個超基本的用法 not_to,基本上就是把常用的 to 替代掉而已,至於功能是什麼,字面上應該是非常的清楚!

但還是用一個小小的範例來補充一下:

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

就非常簡單的反義,實用點數五顆星!

Comparison matchers

比較用的 matcher 這也是使用度非常高的一個,使用的方法也非常簡單。

就是大於、小於、這類很直覺的東西!

可以用很多的範例來讓看看,順便練習我們之前提過 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,明天也會接著繼續介紹!

上一篇文章RSpec - 你一定要知道的 Matchers

下一篇文章RSpec - 更多的 Matchers ( 中 )