RSpec: 幾種減少程式碼重複的方式

李威辰
2 min readMar 14, 2019

--

RSpec 是在開發 Ruby 專案時常用的測試框架,在寫測試的過程中,常常會碰到寫重複程式碼的情況。我們可以利用 RSpec 或 Ruby 本身提供的幾種方式來避免這種情況發生,本篇文章介紹幾種方式來減少測試程式碼的重複。

let

在這篇文章我會用一個簡單的 RSpec 程式來示範說明

在上面的例子可以看到,兩個 test example(it) 各自初始化自己的 user,這邊就是一個可以使用 let 的好時機。

藉由 let 就可以在需要的時候去初始化 user ,而不用每個 it 裡面都初始化一次。值得注意的地方是 let 方法是 lazy evaluation,意思就是只有在呼叫的時候才會初始化 user,而不是事先初始化。如果需要事先初始化的話,就得用 let! 方法。

before

before 方法可以在每個 test example 之前運行自訂的程式碼,減少重複。跟 let 不同的地方是,不只是初始化資料,before 可以做更多事情,比如說設置一些資料間的相依性。

在這個版本裡面,user 可以新增朋友(User#add_friend)以及列出朋友的名字(User#show_friend_names)、性別(User#show_friend_genders)。可以發現在兩個 test example 中重複的程式碼是用來設置資料間的相依性的,這種狀況就非常適合用 before 來解決程式碼重複的問題。

before 方法要注意的地方是如果變數是要傳給別的 test example 用的話,必須用 instance variable(user1 變成@user1)。

helper method

既然是 Ruby ,當然也可以用 helper method 來減少重複的程式碼。下面的例子有點殺雞用牛刀,但這邊的目的主要是示範 helper method 是可以把很多邏輯抽象化,讓程式碼更簡潔的。

結語

這篇文章介紹了三種在 RSpec 減少程式碼重複的方法,分別是 let、before 以及 helper method。掌握這些技巧之後,寫RSpec 就不會因為要改動一個邏輯或依賴要同時改很多地方了。當然還有一些技巧這篇文章沒有提到,比如說如何在不同的 XXX_spec.rb 檔案間分享 context 以及 example,下次有機會在寫這些主題。

--

--