2007-07-05
■[rest][test]テストの中でnamed routesを使う
テストコードにおいて、RESTfulなURLへのリンクやformのactionがあることをassertする場合、どう書きますか?例えば下のようなリンクが表示されることを確認したい場合です。
<a href="/products/1;edit">
下のようにパスをハードコードしてしまったら、
assert_select "a[href = /products/1;edit]"
Rails 2.0でパスのスキーマが変わった時(/products/1;editが/products/1/editになった時)テストコードを書き直さなければなりません。
コントローラで使える名前付きルート(named routes, resource routes)はprotectedなので、次のように書くと
assert_select "a[href = #{@controller.edit_product_path(1)}]"
エラーになります。
url_forはpublicメソッドなので下のように書くことができますが*1
assert_select "a[href = #{@controller.url_for(:action => 'edit', :id => 1, :only_path => true)}]"
resource routeがあるものをurl_forで書くのは何だかカッコ悪いです。
テストの間だけnamed routesをpublicに
テストコードの中で次のように書いてやると、上に出てきたedit_product_pathを使えるようになります。
class ProductsController public :edit_product_path end
例えばこの例だと、products_controller_test.rbのclass ProductsControllerTest < Test::Unit::TestCaseなどと書いてある行の上にでも書けば十分でしょう。
protectedのようなアクセス制限は、本来プログラマーにオブジェクト指向に従ったコーディングを促し、ソフトウェアの品質を高めるために存在するので、むやみに解除すべきではありませんが、テストコードの中でのみ使う限り問題ないと思われます。
この方法の問題点は、数あるnamed routesを使う分だけ列挙する必要があることです。個人的な感覚では5,6個までなら我慢できますが、それ以上になったらまとめてpublicにできるヘルパーを書きたくなります。
皆さんはこういうテストをどう書いてますか???
- 16 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=0zr&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=rails+routing+resource&spell=1
- 10 http://www.google.co.jp/search?hl=ja&client=firefox&rls=org.mozilla:ja:official&hs=atO&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=routes+product's+rails&spell=1
- 7 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2006-38,GGLG:ja&q=rails+only_path
- 6 http://b.hatena.ne.jp/entry/5198944
- 6 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=ugK&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=REST+Test&spell=1
- 4 http://209.85.175.104/search?q=cache:5bczUY0VAl0J:d.hatena.ne.jp/irohiroki/20070629/keywords+rails+カラム名+予約語&hl=ja&ct=clnk&cd=4&gl=jp
- 4 http://reader.livedoor.com/reader/
- 4 http://webcache.googleusercontent.com/search?q=cache:5bczUY0VAl0J:d.hatena.ne.jp/irohiroki/20070629/keywords+rails 予約語+response&cd=4&hl=ja&ct=clnk&gl=jp&client=firefox-a
- 4 http://www.google.co.jp/search?hl=ja&q=rails+予約語&lr=
- 3 http://72.14.235.104/search?q=cache:5bczUY0VAl0J:d.hatena.ne.jp/irohiroki/20070629/keywords+rails+予約語&hl=ja&ct=clnk&cd=1&gl=jp
