よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

April 15, 2006

[Ruby] Ruby-GetText-Package-1.4.0

リリースしました。

  1. OpenBSDでも使用できるようになりました。
  2. RubyOnRailsサポートの強化
  3. ActionWebServiceのサポート
  4. ActionMailerでマルチパートのメールサポート
  5. RubyOnRails-1.1.2のサポート

ドキュメントはまだ英語版しか追いついていません。

ただし、機能追加はRoRのみです。RoRを使っている方で最新機能の確認をしたい方はここを参照してください。

[Ruby] GC周りの不具合

拡張ライブラリを作っていてGC周りの不具合を見つけたい場合はどうするのが一番良いんでしょう。とりあえず以下のようなスクリプトを考えてみました。

$ cat gct.rb
Thread.new do
  loop do
    sleep 0.01
    GC.start
    p "GCed"
  end
end

んで、実行

$ ruby -rgct target.rb

これを使うと現在のRuby-GNOME2 CVS版は結構良い感じでSEGVします、って、今のCVS(Ruby-GNOME2)は相当熱いのでRuby-GNOME2を使う場合は正式リリース版の0.14.1を使ってくださいませ。


April 15, 2007

[Rails] FunctionalTestとIntegrationTestでローカライズの確認テスト

そろそろまじめにRuby-GetText-Packageのテストケースの1つとしてテスト用Railsアプリを作ってそれのテストを書いていこうと思いたち、Railsのテストケースを勉強し始めてみた(っておぃ(^^;))。

で、お恥ずかしながら多少混乱したので整理しておこうと思う。ローカライズされた文字列もきちんとテストしたかったんだよなぁ、と言う人(プロジェクト)には参考になるかも。

最初にRuby-GetText-Packageがどのようにローカライズする言語を特定するかのおさらい。Ruby-GetText-PackageのCGIバージョンではHTTP_ACCEPT_LANGUAGE、クッキーに保持された"lang"という値、QUERY_STRINGの"lang"というパラメータの値、GetText.locale=で指定した言語、のそれぞれを参照してローカライズする言語を決める(後者の方が優先)。つまり、ローカライズ用のテストではそれらのどれかを明示的に指定してあげる必要がある。

FunctionalTestでは、前述したロケールの値はいずれにせよparams["lang"]にいったん格納されるのでそれを応用する。テストのメソッドだけ抜き出すとこんな感じ。

test/functional/xxxxs_controller_test.rbのテスト例:
  def test_list
    get :list, :lang => "ja"
    puts @response.body  #実際はテストを書く。
  end

IntegrationTestでは、第3引数にHTTPヘッダを利用できるので、よりリアル(?)なテストができる。まぁ、正直、アプリのテストでこの差は意味ないとは思うけど(^^;)。

test/integration/xxx_test.rbのテスト例:
  def test_list
    get "/articles/list", nil, :accept_language => "ja"
    puts @response.body
  end

もちろん、第2引数を使うのであれば、FunctionalTestと同様に:langを使ったテストが可能。

test/integration/xxx_test.rbのテスト例:
  def test_list
    get "/articles/list", :lang => "ja"
    puts @response.body
  end

ちなみに、Functionalか、Integrationのどちらでローカライズのテストをするのか?ってちょっと迷うね。両方ってこともないだろうから、どちらかでやれば良いと思うんだけど・・・。部品のテストでないのであればFunctionalではなくIntegrationで実施するのが良いのではないかと思うんだけど、実際はどうなのかな。

っとまぁ、そんなこんなで書き方もわかったことだし、テストを書き始めるとするか・・・、ってこんな時間かよ、明日にしよう。

#そしてテストはいつになっても書き始まらないのだった。つづく。

あ、そうそう。どのテストでもGetText.locale = "ja"とかしてしまえば強制的に日本語化できちゃうんだけど、それはCGIのルールを全く無視してしまう方法なのでできれば上で述べた方法をお薦めします。


追記