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

這樣在測試執行前,測試數據庫將會完整清空,確保有乾淨的測試環境。

results matching ""

    No results matching ""