2011年9月11日 星期日

Ruby on Rails 的整合測試 (Integration testing)

撰寫自動化測試是寫程式非常重要的一環,在 Ruby 裡有許多的測試框架,但最多人推崇的非 RSpec 莫屬。

關於 RSpec 的介紹,可以參考:

 

但若要完成整合測試,光靠 RSpec 可能還是有點不足,這時我們可以配合 Capybara 做更完整的測試。

Capybara 會偷開 Server (rails server),然後讓測試程式真的訪問我們所寫的 Web,因此所得到的互動結果是真實發生的狀況。

這個網站有非常清楚關於 RSpecCapybara 的教學

http://opinionated-programmer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/

 

實際寫起來可以像這樣

#encoding: utf-8
require 'spec_helper'
 
describe '活動頁面' do
  it '第一次進入此頁面,應該跳轉至註冊頁面' do
    visit '/campaigns'
    page.current_url.should =~ %r(http://[^/]+/sign_up)
  end
  
  it '實際註冊後,應該跳轉至登入頁面' do
    visit '/sign_up'
    fill_in 'user_email', :with => 'root@example.com'
    fill_in 'user_password', :with => 'root'
    fill_in 'user_password_confirmation', :with => 'root'
    click_on '註冊'
    
    page.current_url.should =~ %r(http://[^/]+/log_in)
  end
end

 

看了上面的例子,像不像在寫 spec 一樣呀?其實這個 spec 是可以拿來測試的喔!

 

其它

如果需要指定測試 Server 開啟在指定 port 的話,可以下達以下指令

Capybara.server_port = 3000

要回到 random port 的話,那麼可以…

Capybara.server_port = nil

 

2011/9/28 更新

記得把測試資料夾設定成 ./spec/requests/*_spec.rb,或是在每個測試項目加上「:type => :request」。如果資料夾不這麼命名,那就不會默認有「:type => :request」這個設置…成立一個新專案,要建置測試時出錯,找了一天才找到解法…

it 'xxxxxxxxxxxxx', :type => :request do
    # ......
end

 

參考資料

https://github.com/jnicklas/capybara/issues/483

沒有留言:

張貼留言