iT邦幫忙

DAY 12
0

從想法到快速實作的捷徑:Rails系列 第 12

[ Day 12 ][ Dev ] rspec - 用Factory造測試用的假物件

前面有說過這裡不要把太多東西抽出來沒有關係,(免得要滑上滑下找來找去的,這樣測試反而還成了一種負擔)

這也是為什麼不用subject的原因,我想剛開始寫rspec的話去使用subject會造成混淆。

但是這些都不代表我們不能去把它變得更好,

變得更好聽起來有些籠統,不過其實有些細節省略掉後,我們仍然能夠知道他在幹嘛的,

舉例來說就是

Post.create(title: "OK bye", content: "doesn't matter")

這一段,

我們只要知道能拿到post物件就可以了,怎麼製造他的細節其實並不重要,

有沒有一個好的解決辦法是我們能夠直接拿到造好的物件呢?

這就是Factory存在的功用啦!

我們昨天已經安裝完fabrication這個gem,現在就是運用它的時候了:

(Fabrication就是仿製品的意思,所以用這個也讓我們的code語義化了)

先在spec/底下新增一個fabricators的資料夾,

如果要製造一個post的語法是像下面這樣

Fabricator(:post) do
  title { Faker::Lorem.characters(20) }
  content { Faker::Lorem.paragraph(3) }
end

這裡用到了Faker這個gem來生成假資料,就不用再自己一個一個打字了,

下方參考資料Faker在github的readme有很多好玩的指令可以用。

接下來就可以把所有Post.create開頭的地方替換成:Fabricate(:post)

不用再去管其中的細節是什麼了。

中間有很多要輸入params的地方,也可以同樣使用fabrication來製造,

而且不用再fabricator裡面新增code,直接在這裡加上Fabricate.attributes\_for(:post)

就能拿到製造valid post的params了,

有人會認為還是要留著會比較知道在測什麼,不過這裡就見仁見智了。

如果要製造一個invalid_post也很簡單,在剛剛fabricator的下方加上這一段:

Fabricator(:invalid_post, :from => :post) do
  title { Faker::Lorem.characters(51) }
end






Fabricate.attributes_for(:invalid_post)

就可以直接使用了。

如果你不喜歡Fabrication的話也可以用Factory Girl,

坦白說我之前也都是用Factory Girl的,

不過因為想要學學看新的gem怎麼用,所以之後的文章還是會以Fabrication為主。

參考資料:


上一篇
[ Day 11 ][ Dev ] 更進一步認識Rails - rspec
下一篇
[ Day 13 ][ Dev ] Guard - 自動化運行測試的好朋友
系列文
從想法到快速實作的捷徑:Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言