投稿遅くなってすみません。
最近、Rails標準のテスティングフレームワークを使ってテストコードを書いているのですが、その際に覚えたいくつかのことをまとめてみようと思います。
前提
Rails4.1の話です。
Controllerのテストを書くときに最低限覚えるべきassertメソッド
Railsの標準テスティングフレームワークはTest::Unitを拡張して作られています。
Modelで使うメソッドはTest::Unitのそれとあんまり変わらないのでいいのですが、Controllerのテストは拡張されたメソッドが多く実装されています。ここではその中で最低限覚えておいたほうが良いと思うものを紹介します。
Controllerのテストを書くときは、すでにModelのテストを書いているので以下の項目に絞ってテストコードを書くようにしています。
- 適切なテンプレート、レイアウトファイルが選択されているか
- 適切にリダイレクトされているか
- 適切なflashメッセージが設定されているか
- create/update/deleteの実行前後でデータのcountが正しく変化しているか
ですので、上記を確認するために必要なassertメソッドを簡単にまとめたいと思います。
適切なテンプレート、レイアウトファイルが選択されているか
get :xxx
assert_response :success
assert_template :xxx, layout: :xxx
適切にリダイレクトされているか
get :xxx
assert_redirected_to xxx_path
適切なflashメッセージが設定されているか
get :xxx
assert_redirected_to xxx_path
assert_equal 'xxx', flash[:alert] # あるいはflash[:notice]など
create/update/deleteの実行前後でデータのcountが正しく変化しているか
countが1つ減っていることを確認したい場合を例に取ります。
assert_difference('Hoge.count', -1) do
delete :destroy, id: @hoge
end
countが変化していないことを確認したい場合はassert_no_differenceが使えます。
詳細はRails Guideを参照してください。
現在日時を操作したいときはtravel/travel_to/travel_backが使える
Rails4.1からテスト用ヘルパーとして標準でtravel/travel_to/travel_backが使えるようになっています。
例えば、こんなふうに書けば
travel 1.day
現在日時を1日進めることができます。travel_toを使えば指定した日時に固定することも可能です。特にMailerのテスト周りで重宝しています。
以下のAPIドキュメントに詳細が載っていますので、ご参照ください。
テスト実行時にスタブを作りたいときはmochaを使う
mochaを使えば以下のように簡単にスタブが作れます。
test 'test hoge' do
User.expects(:hoge).returns('fuga')
end
インストールとセットアップの方法については以前にQiitaに記事を書いたので、気になる方はそちらを参照してください。
rails consoleでヘルパーを試しに実行して確認する
テストと直接関係ないのですが、開発中にコンソールからヘルパーの動作確認や出力内容の確認をしたいケースがあるかと思います。
xxx_pathやxxx_urlなどを確認をしたいときはappオブジェクトが使えます。
こんな感じです。
$ bin/rails c
Loading development environment (Rails 4.1.8)
pry(main)> app.root_path
⇒"/"
また、ビューヘルパーの確認をしたいときはhelperオブジェクトが使えます。
こんな感じです。
$ bin/rails c
Loading development environment (Rails 4.1.8)
pry(main)> helper.label_tag 'name'
⇒ "<label for=\"name\">Name</label>"
rails console自体は今までModelに実装したメソッドやActiveRecordのメソッドを実行するために使っていて、ヘルパーは実行できないと勘違いしていました。簡単に手元で試したいときに便利だと思います。
rakeと打つだけでrake testを実行できる
rakeと打つだけでrake testが走ります。つい最近知りました。
手元のコンソールでさくっとテストを動かしたいとき、少しだけ手が楽です。
最後に
去年まではずっとAdvent Calendarは書くものではなく、見るだけのものでした。今年は参加してみようと思い、早くから登録したのですが、、なかなか書けないですね。普段Qiitaに書いている気軽さでは書けない。期限に遅れてしまってすみませんでした。