Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

最近、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を参照してください。

http://guides.rubyonrails.org/testing.html

現在日時を操作したいときはtravel/travel_to/travel_backが使える

Rails4.1からテスト用ヘルパーとして標準でtravel/travel_to/travel_backが使えるようになっています。

例えば、こんなふうに書けば

travel 1.day

現在日時を1日進めることができます。travel_toを使えば指定した日時に固定することも可能です。特にMailerのテスト周りで重宝しています。

以下のAPIドキュメントに詳細が載っていますので、ご参照ください。

http://api.rubyonrails.org/classes/ActiveSupport/Testing/TimeHelpers.html

テスト実行時にスタブを作りたいときはmochaを使う

mochaを使えば以下のように簡単にスタブが作れます。

test 'test hoge' do
  User.expects(:hoge).returns('fuga')
end

インストールとセットアップの方法については以前にQiitaに記事を書いたので、気になる方はそちらを参照してください。

http://qiita.com/knt45/items/073a1a806bbccb694524

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

knt45
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away