IT 邦鐵人賽 Day 16 - RSpec 語法 shared_context

昨天介紹了 shared_examples 的概念,如果理解,今天的內容就非常容易了。事不宜遲,馬上來介紹我們的 shared_context 吧。

shared_context

一樣是在測試項目一樣的情況,shared_examples 主要就是把重複測試項目抽離,而 shared_context 則是把「受測標的」全部抽離打包成一個 group,然後再 include_context 到測試項目的 group 裡:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Comebuy
attr_accessor :containers, :liquid

def initialize(container, liquid)
@containers = container
@liquid = liquid
end
end

RSpec.shared_context "Comebuy" do
let(:bubble_black_tea) { Comebuy.new("bubble", "black_tea") }

subject { Comebuy.new("bubble", "milk_tea") }

before do
@bubble_green_tea = Comebuy.new("bubble", "green_tea")
end
end

RSpec.describe "Quality Examination for bubble_blacktea" do
include_context "Comebuy"
it "is black tea" do
expect(bubble_black_tea.liquid).to eq("black_tea")
end
end

RSpec.describe "Quality Examination for bubble_milk_tea" do
include_context "Comebuy"
it "is milk tea" do
expect(subject.liquid).to eq("milk_tea")
end
end

RSpec.describe "Quality Examination for bubble_green_tea" do
include_context "Comebuy"
it "is green tea" do
expect(@bubble_green_tea.liquid).to eq("green_tea")
end
end

如此一來,便可以在每個 group 裡省略「受測標的」的 code,讓 group 乾淨優雅一點。

小結

今天介紹的 shared_context 與昨天的 shared_example 都在做同樣的事情:避免重複。

而避免重複也是 Ruby 強調的重點: Do not repeat yourself.

簡單複習一下:

shared_examples 是將重複的 examples 打包起來抽離出來。

shared_context 是將每個 examples 的受測標的打包並抽離。

明天開始我們將要把 Rspec 帶入 Rails 裡,並逐步介紹好用且常用的測試套件與框架。