该文章同步发布於:我的部落格
昨天结尾有稍微提到,若是有相同的 example 该怎麽办?
RSpec 在节省程序码这块可以说是不遗余力,甚至连常常使用到 example 都可以收纳在一个档案中再引入来使用!
我们先来举一个极端一点的例子,假设你在不同的测试档案中,都刚好要测试 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 引入做使用,效果就像你直接写在里面一样!
接下来这个也是一样可以搜集程序码的好方法,但我觉得更好用的一点。
毕竟 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
我自己觉得蛮好用的。
因为专案越大,有交集的逻辑会越来越多,所以有些东西都可以抽出来,使得当页面的负担较小,看起来更舒服易读!
大家好,明明才第13天,我已经不知道要发什麽文了呜呜╯︿╰,但难产生出的文还是一样充满了知识!!希望...
30天铁人赛,自我挑战组,想了很久不知道第一道该上什麽菜 想到自我挑战,决定第一篇先来自我挑战一下,...
今天要来介绍安装及练习CPE的软件 先进入以下网址: http://coding-frenzy.ar...
用 PubSub 更新游戏状态 现在我们要让玩家订阅游戏的状态 并让游戏在状态更新的时候,广播到双方...
Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...