Mocking
在這個例子裡面,我們用了 mock 手法,確認 show
這個 action,真的有去呼叫 Suggestion.find
allow(Suggestion).to receive(:find).and_return(suggestion)
expect(Suggestion).to receive(:find)
劣勢:順序「反直覺」
但是其實這樣的寫法,對於我們之前提到的 Four-Phase Test:
- Setup (準備測試資料)
- Exercie (實際執行測試)
- Verification (驗證測試結果)
- Teardown (拆解測試)
有點相違背了。
我們先做了 Verification (expect)再做 Exercise ( get :show) 。
劣勢:容易失敗
而且在拆解階段,我們會將這段測試重寫成這樣。將 expect 寫在 before 階段,但這樣寫的缺點是,expect 如果不如預期,後面測試會因為 except 全死。
Spying
與其使用 Mocking 手法,我們可以改用 Spy 手法,將測試改成這樣。(RSpec 使用 have_received 去驗證)
Four Phase 順序不但正確,而且是在 Exercise 後,才做 Verification。