2012-12-20
Capybara の using_session でセッションを切り替えつつインテグレーションテストをする
ユーザAとユーザBが順番にアクセスしに来て云々という spec を書きたい、ので ググったら Capybara に using_session なんつー便利メソッドがあった!のでみなさん使うと良いです。
ドキュメント素っ気ない…。便利なのに…。
以下は wiki のページ衝突の example。片方が更新したのに、それを知らずにページ更新しようとするとコンフリクト画面が出る、みたいな。
using_session(:bob) {
login(bob)
visit page_edit_path(target_page)
}
using_session(:tom) {
login(tom)
visit page_edit_path(target_page)
}
using_session(:bob) {
fill_in 'page_content', with: "# bob's page"
click_button 'Save'
page.should have_selector 'h3', text: "bob's page"
}
using_session(:tom) {
fill_in 'page_content', with: "# tom's page"
click_button 'Save'
page.should_not have_selector 'h3', text: "tom's page"
page.should have_selector '#page_content', text: "# tom's page"
page.should have_selector('#confrict')
...
Rails でアプリ内部から発行してる http をトレースする
の続き。デバッグ用にセットしたら便利だったのでメモ。
Gemfile
group :test, :development do
gem 'webmock', require: false
end
しておいて
config/environments/development.rb
if ENV['WEBMOCK_ENABLE']
require 'webmock'
WebMock.allow_net_connect!
WebMock.after_request do |request_signature, response|
res = ["=== HTTP Request ===", "#{request_signature}", "", response.status.join(' ')]
res << response.headers.map {|key, val| "#{key}: #{val}" }.join("\n")
unless response.body.empty?
res << ""
res << response.body
end
res << "=" * res.first.size
Rails.logger.debug res.join("\n")
end
end
しておいて
WEBMOCK_ENABLE=1 rails s
すると、http 叩いてるところが以下みたいに出て便利。
=== HTTP Request === GET http://example.com/ with headers {'Accept'=>'/', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}
302 Found Location: http://www.iana.org/domains/example/ Server: BigIP Connection: Keep-Alive Content-Length: 0
=== HTTP Request === GET http://www.iana.org/domains/example/ with headers {'Accept'=>'/', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}
200 OK Date: Thu, 20 Dec 2012 07:16:22 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Thu, 06 Dec 2012 19:40:14 GMT Content-Length: 606 Vary: Accept-Encoding Connection: close Content-Type: text/html; charset=UTF-8 ....