Ch 3 使用 Capybara 做 Integration 測試
在 ⽤ Bootstrap 做⼀個「有 Nav bar 」的 layout 小節,我們已經使用了 Capybara 來測試頁面是否有特定元素存在。
$ cat spec/features/home_spec.rb
require "rails_helper"
RSpec.describe "Home" do
scenario "has navbar element" do
visit root_url
expect(page).to have_css "nav.navbar"
end
end
What is Capybara?
Capybara 是一個 RubyGem,提供了 API 跟瀏覽器做互動。可以模擬使用者真實使用網站的行為(用內置的 Rack::Test
),也可以真的啟動瀏覽器來測試 JavaScript。
常用的 Capybara 方法介紹
feature
feature
是 Capybara 提供的方法,在區塊裡面的程式都可以享用所有 Capybara 提供的方法。
接受的字串用來描述這個功能在做什麼。
RSpec.feature "..." do
...
end
一個 feature spec 一個檔案,比如 user_authentications_spec.rb
。
RSpec.feature "User Authentication" do
end
feature
其實用起來就跟 describe
一樣,只是在裡面可以用許多 Capybara 所提供的方法來幫助我們撰寫測試。
scenario
一個“功能”有很多使用“場景”,scenario
其實就是 it
的別名(alias)。
feature "Secret Pages" do
context "when signed in as admin" do
scenario "can see secret pages" do
...
end
end
end
T> 注意到在 feature
區塊裡面本來的 context
(和 describe
)還是可以使用!
background
和 before
用途相同,,提供主要是為了測試的可讀性。
表示畫面的對象
page
可以拿到當前頁面的 HTML 內容:page.html
。
操作畫面的方法 Navigations
visit
click_on
click
click_button
within
fill_in
檢查畫面的方法 Expectations
have_text
have_link
has_link?
have_css
完整方法請參考:https://github.com/teamcapybara/capybara。
一個簡單的例子:測試 404 頁面
只是示例,不用加:
require "rails_helper"
RSpec.feature "Error Pages" do
scenario "user views error page" do
visit "/404"
expect(page).to have_text("The page you were looking for doesn't exist")
end
end
資料庫重置
為了確保測試之間資料彼此不干擾,通常會在測試執行前後將資料全數清空。
主流有兩個 Gem:
Database Rewinder
https://github.com/amatsuda/database_rewinder
安裝,修改 Gemfile
:
# Gemfile
group :test do
gem "database_rewinder"
end
配置 DatabaseRewinder:
$ touch spec/support/database_rewinder.rb
spec/support/database_rewinder.rb
填入以下內容:
RSpec.configure do |config|
config.before :suite do
DatabaseRewinder.clean_all
end
config.after :each do
DatabaseRewinder.clean
end
end
這樣在測試執行前,測試數據庫將會完整清空,確保有乾淨的測試環境。