LoginSignup
52

More than 5 years have passed since last update.

Railsの標準テスティングフレームワークを使っていて覚えたこと

Last updated at Posted at 2014-12-07

投稿遅くなってすみません。

最近、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に書いている気軽さでは書けない。期限に遅れてしまってすみませんでした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52