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

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のルールを全く無視してしまう方法なのでできれば上で述べた方法をお薦めします。


編集