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

記事の一覧 >

関連するかもエントリー

Ruby の http ライブラリの通信を表示する http-dump を作った
f:id:secondlife:20140110170809p:plainRuby 上で http を叩いた通信見たい時に、毎回同じ事をやってるので抽象化して http-dump というライブラリを作った。https://github.com/hotchpotch/http-du...
f:id:secondlife:20140110170809p:plainRuby 上で http を叩いた通信見たい時に、毎回同じ事をやっ...
2011-06-15
Ruby で Array を継承したクラスをうまくあつかうRuby で Array を継承/Mix-inしたクラスで、自分で定義した便利なメソッドを利用したい時ってありますよね。そんなとき普通にclass MyArray < Array def odd select ...
Ruby で Array を継承したクラスをうまくあつかうRuby で Array を継承/Mix-inしたクラスで、自分で定義した便利なメ...
Ruby で並列実行処理を簡単に書く
Ruby で並列実行処理を簡単に書くRuby は 1.8 だとグリーンスレッドだし、1.9 でも Giant VM lock のためネイティブスレッドの実行は一つのため、マルチコアを生かした処理をかんたんに書くのがいささか面倒だったりしますね。で、 parallel というライブ...
Ruby で並列実行処理を簡単に書くRuby は 1.8 だとグリーンスレッドだし、1.9 でも Giant VM lock のためネイティ...