Day 14 分享你的 Example!

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

前言

昨天结尾有稍微提到,若是有相同的 example 该怎麽办?

RSpec 在节省程序码这块可以说是不遗余力,甚至连常常使用到 example 都可以收纳在一个档案中再引入来使用!

Shared_examples

我们先来举一个极端一点的例子,假设你在不同的测试档案中,都刚好要测试 subject 的长度好了!

RSpec.describe Hash do
  subject {{a: 1, b: 2, c: 3}}
end

RSpec.describe Array do
  subject {[1, 2, 3]}
end

RSpec.describe String do
  subject {"abc"}
end

可以想一下上面若是三个不同的测试档案,想必我们就会正常的写:

RSpec.describe Hash do
  subject {{a: 1, b: 2, c: 3}}
  it "return length of subject" do
    expect(subject.length).to be(3)
  end
end

RSpec.describe Array do
  subject {[1, 2, 3]}
  .....
end

RSpec.describe String do
  subject {"abc"}
  .....
end

就一样的东西写三次,感觉也没什麽,但若是量提高了,这时候我们能做些什麽?

就可以使用 RSpec 提供的 shared_examples 来抽离这些重复的 examples。

使用范例应该就能快速理解!

RSpec.shared_examples "Object with three elements" do
  it "return length of subject" do
    expect(subject.length).to eq(3)
  end
end

这样我们就建立好了一个可以被分享的 example,至於要如何使用呢?

我们只要引入这个 example 最上层的叙述就可以了!所以改写一下我们原本的范例:

RSpec.describe Hash do
  subject {{a: 1, b: 2, c: 3}}
  include_exmaples "Object with three elements"
end

RSpec.describe Array do
  subject {[1, 2, 3]}
  include_exmaples "Object with three elements"
end

RSpec.describe String do
  subject {"abc"}
  include_exmaples "Object with three elements"
end

以上的测试会全数通过喔! include_exmaples 这个方法可以把我们放在别的地方的 exmaple 引入做使用,效果就像你直接写在里面一样!

Shared_context

接下来这个也是一样可以搜集程序码的好方法,但我觉得更好用的一点。

毕竟 example 这种东西比较客制化,但如果是 shared_context 就可以放比较多设定的部分,物件等等...

直接用程序码应该会更好懂一点:

RSpec.shared_context "common_burger" do
  before do
    @big_mac = Burger.new("Beef", "Cheddar")
  end
  
  def shrimp_burger
    @shrimp_burger = Burger.new("Shrimp", "Mozarella")
  end
  
  let(:pork_burger) { Burger.new("Pork", "Pecorino")}
end

我们制作了一个拿来分享的 context 里面有着一堆不同种类的汉堡,他可能需要在不同的测试档做使用!

这时候如果我们发现我们在设定物件的时候不停的重复,我们就可以把重复的物件蒐集到 shared_context 里面,然後在 include 进来也一样!

就像范例中一样:

RSpec.describe Burger do
  include_context "common_burger"
  
  it "return shrimp" do
   expect(shrimp_burger.meat).to eq("Shrimp") 
  end
  ....
end

RSpec.describe Store do
  include_context "common_burger"

  it "have big mac" do
    expect(@big_mac.meat).to eq("Beef")
  end
  ....
end

我们不用在上方堆叠一大堆的 let 或是 before hooks 这类的东西,我们可以在很多的测试档中 include 进来使用!

有没有超方便的,但如果你要放在不同的档案里面,记得要 require 来做使用喔!

不然 Ruby 本身会不知道你在 include 什麽样的东西!

require "../你的档名" # 详细还是要看档案放置位置,来决定前面的 .. 数量或是不需要 ..

小结

今天介绍了两个整理程序码的方法,shared_examples 实际使用的时候比较少一点;但 shared_context 我自己觉得蛮好用的。

因为专案越大,有交集的逻辑会越来越多,所以有些东西都可以抽出来,使得当页面的负担较小,看起来更舒服易读!


<<:  Day 26 : Github Actions

>>:  C# 入门之函数重载

[Day 13]Template应用

大家好,明明才第13天,我已经不知道要发什麽文了呜呜╯︿╰,但难产生出的文还是一样充满了知识!!希望...

Day 1-酸酸甜甜的湘粤美人-糖醋排骨

30天铁人赛,自我挑战组,想了很久不知道第一道该上什麽菜 想到自我挑战,决定第一篇先来自我挑战一下,...

[Day1]疯狂程设安装及创建帐号教学

今天要来介绍安装及练习CPE的软件 先进入以下网址: http://coding-frenzy.ar...

24 让画面跟游戏联动

用 PubSub 更新游戏状态 现在我们要让玩家订阅游戏的状态 并让游戏在状态更新的时候,广播到双方...

EP 1: Create empty Xamarin.Forms project for TopStore App

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...