A Day in the Life

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 ....