前面有說過這裡不要把太多東西抽出來沒有關係,(免得要滑上滑下找來找去的,這樣測試反而還成了一種負擔)
這也是為什麼不用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為主。
參考資料: